//===----------------------------------------------------------------------===//
//
// This source file is part of the Soto for AWS open source project
//
// Copyright (c) 2017-2021 the Soto project authors
// Licensed under Apache License v2.0
//
// See LICENSE.txt for license information
// See CONTRIBUTORS.txt for the list of Soto project authors
//
// SPDX-License-Identifier: Apache-2.0
//
//===----------------------------------------------------------------------===//

// THIS FILE IS AUTOMATICALLY GENERATED by https://github.com/soto-project/soto/tree/main/CodeGenerator. DO NOT EDIT.

import Foundation
import SotoCore

extension KMS {
    // MARK: Enums

    public enum AlgorithmSpec: String, CustomStringConvertible, Codable {
        case rsaesOaepSha1 = "RSAES_OAEP_SHA_1"
        case rsaesOaepSha256 = "RSAES_OAEP_SHA_256"
        case rsaesPkcs1V15 = "RSAES_PKCS1_V1_5"
        public var description: String { return self.rawValue }
    }

    public enum ConnectionErrorCodeType: String, CustomStringConvertible, Codable {
        case clusterNotFound = "CLUSTER_NOT_FOUND"
        case insufficientCloudhsmHsms = "INSUFFICIENT_CLOUDHSM_HSMS"
        case internalError = "INTERNAL_ERROR"
        case invalidCredentials = "INVALID_CREDENTIALS"
        case networkErrors = "NETWORK_ERRORS"
        case subnetNotFound = "SUBNET_NOT_FOUND"
        case userLockedOut = "USER_LOCKED_OUT"
        case userLoggedIn = "USER_LOGGED_IN"
        case userNotFound = "USER_NOT_FOUND"
        public var description: String { return self.rawValue }
    }

    public enum ConnectionStateType: String, CustomStringConvertible, Codable {
        case connected = "CONNECTED"
        case connecting = "CONNECTING"
        case disconnected = "DISCONNECTED"
        case disconnecting = "DISCONNECTING"
        case failed = "FAILED"
        public var description: String { return self.rawValue }
    }

    public enum CustomerMasterKeySpec: String, CustomStringConvertible, Codable {
        case eccNistP256 = "ECC_NIST_P256"
        case eccNistP384 = "ECC_NIST_P384"
        case eccNistP521 = "ECC_NIST_P521"
        case eccSecgP256K1 = "ECC_SECG_P256K1"
        case rsa2048 = "RSA_2048"
        case rsa3072 = "RSA_3072"
        case rsa4096 = "RSA_4096"
        case symmetricDefault = "SYMMETRIC_DEFAULT"
        public var description: String { return self.rawValue }
    }

    public enum DataKeyPairSpec: String, CustomStringConvertible, Codable {
        case eccNistP256 = "ECC_NIST_P256"
        case eccNistP384 = "ECC_NIST_P384"
        case eccNistP521 = "ECC_NIST_P521"
        case eccSecgP256K1 = "ECC_SECG_P256K1"
        case rsa2048 = "RSA_2048"
        case rsa3072 = "RSA_3072"
        case rsa4096 = "RSA_4096"
        public var description: String { return self.rawValue }
    }

    public enum DataKeySpec: String, CustomStringConvertible, Codable {
        case aes128 = "AES_128"
        case aes256 = "AES_256"
        public var description: String { return self.rawValue }
    }

    public enum EncryptionAlgorithmSpec: String, CustomStringConvertible, Codable {
        case rsaesOaepSha1 = "RSAES_OAEP_SHA_1"
        case rsaesOaepSha256 = "RSAES_OAEP_SHA_256"
        case symmetricDefault = "SYMMETRIC_DEFAULT"
        public var description: String { return self.rawValue }
    }

    public enum ExpirationModelType: String, CustomStringConvertible, Codable {
        case keyMaterialDoesNotExpire = "KEY_MATERIAL_DOES_NOT_EXPIRE"
        case keyMaterialExpires = "KEY_MATERIAL_EXPIRES"
        public var description: String { return self.rawValue }
    }

    public enum GrantOperation: String, CustomStringConvertible, Codable {
        case creategrant = "CreateGrant"
        case decrypt = "Decrypt"
        case describekey = "DescribeKey"
        case encrypt = "Encrypt"
        case generatedatakey = "GenerateDataKey"
        case generatedatakeypair = "GenerateDataKeyPair"
        case generatedatakeypairwithoutplaintext = "GenerateDataKeyPairWithoutPlaintext"
        case generatedatakeywithoutplaintext = "GenerateDataKeyWithoutPlaintext"
        case getpublickey = "GetPublicKey"
        case reencryptfrom = "ReEncryptFrom"
        case reencryptto = "ReEncryptTo"
        case retiregrant = "RetireGrant"
        case sign = "Sign"
        case verify = "Verify"
        public var description: String { return self.rawValue }
    }

    public enum KeyManagerType: String, CustomStringConvertible, Codable {
        case aws = "AWS"
        case customer = "CUSTOMER"
        public var description: String { return self.rawValue }
    }

    public enum KeyState: String, CustomStringConvertible, Codable {
        case disabled = "Disabled"
        case enabled = "Enabled"
        case pendingdeletion = "PendingDeletion"
        case pendingimport = "PendingImport"
        case unavailable = "Unavailable"
        public var description: String { return self.rawValue }
    }

    public enum KeyUsageType: String, CustomStringConvertible, Codable {
        case encryptDecrypt = "ENCRYPT_DECRYPT"
        case signVerify = "SIGN_VERIFY"
        public var description: String { return self.rawValue }
    }

    public enum MessageType: String, CustomStringConvertible, Codable {
        case digest = "DIGEST"
        case raw = "RAW"
        public var description: String { return self.rawValue }
    }

    public enum OriginType: String, CustomStringConvertible, Codable {
        case awsCloudhsm = "AWS_CLOUDHSM"
        case awsKms = "AWS_KMS"
        case external = "EXTERNAL"
        public var description: String { return self.rawValue }
    }

    public enum SigningAlgorithmSpec: String, CustomStringConvertible, Codable {
        case ecdsaSha256 = "ECDSA_SHA_256"
        case ecdsaSha384 = "ECDSA_SHA_384"
        case ecdsaSha512 = "ECDSA_SHA_512"
        case rsassaPkcs1V15Sha256 = "RSASSA_PKCS1_V1_5_SHA_256"
        case rsassaPkcs1V15Sha384 = "RSASSA_PKCS1_V1_5_SHA_384"
        case rsassaPkcs1V15Sha512 = "RSASSA_PKCS1_V1_5_SHA_512"
        case rsassaPssSha256 = "RSASSA_PSS_SHA_256"
        case rsassaPssSha384 = "RSASSA_PSS_SHA_384"
        case rsassaPssSha512 = "RSASSA_PSS_SHA_512"
        public var description: String { return self.rawValue }
    }

    public enum WrappingKeySpec: String, CustomStringConvertible, Codable {
        case rsa2048 = "RSA_2048"
        public var description: String { return self.rawValue }
    }

    // MARK: Shapes

    public struct AliasListEntry: AWSDecodableShape {
        /// String that contains the key ARN.
        public let aliasArn: String?
        /// String that contains the alias. This value begins with alias/.
        public let aliasName: String?
        public let creationDate: Date?
        public let lastUpdatedDate: Date?
        /// String that contains the key identifier referred to by the alias.
        public let targetKeyId: String?

        public init(aliasArn: String? = nil, aliasName: String? = nil, creationDate: Date? = nil, lastUpdatedDate: Date? = nil, targetKeyId: String? = nil) {
            self.aliasArn = aliasArn
            self.aliasName = aliasName
            self.creationDate = creationDate
            self.lastUpdatedDate = lastUpdatedDate
            self.targetKeyId = targetKeyId
        }

        private enum CodingKeys: String, CodingKey {
            case aliasArn = "AliasArn"
            case aliasName = "AliasName"
            case creationDate = "CreationDate"
            case lastUpdatedDate = "LastUpdatedDate"
            case targetKeyId = "TargetKeyId"
        }
    }

    public struct CancelKeyDeletionRequest: AWSEncodableShape {
        /// The unique identifier for the customer master key (CMK) for which to cancel deletion. Specify the key ID or the Amazon Resource Name (ARN) of the CMK. For example:   Key ID: 1234abcd-12ab-34cd-56ef-1234567890ab    Key ARN: arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab    To get the key ID and key ARN for a CMK, use ListKeys or DescribeKey.
        public let keyId: String

        public init(keyId: String) {
            self.keyId = keyId
        }

        public func validate(name: String) throws {
            try self.validate(self.keyId, name: "keyId", parent: name, max: 2048)
            try self.validate(self.keyId, name: "keyId", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case keyId = "KeyId"
        }
    }

    public struct CancelKeyDeletionResponse: AWSDecodableShape {
        /// The Amazon Resource Name (key ARN) of the CMK whose deletion is canceled.
        public let keyId: String?

        public init(keyId: String? = nil) {
            self.keyId = keyId
        }

        private enum CodingKeys: String, CodingKey {
            case keyId = "KeyId"
        }
    }

    public struct ConnectCustomKeyStoreRequest: AWSEncodableShape {
        /// Enter the key store ID of the custom key store that you want to connect. To find the ID of a custom key store, use the DescribeCustomKeyStores operation.
        public let customKeyStoreId: String

        public init(customKeyStoreId: String) {
            self.customKeyStoreId = customKeyStoreId
        }

        public func validate(name: String) throws {
            try self.validate(self.customKeyStoreId, name: "customKeyStoreId", parent: name, max: 64)
            try self.validate(self.customKeyStoreId, name: "customKeyStoreId", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case customKeyStoreId = "CustomKeyStoreId"
        }
    }

    public struct ConnectCustomKeyStoreResponse: AWSDecodableShape {
        public init() {}
    }

    public struct CreateAliasRequest: AWSEncodableShape {
        /// Specifies the alias name. This value must begin with alias/ followed by a name, such as alias/ExampleAlias.  The AliasName value must be string of 1-256 characters. It can contain only alphanumeric characters, forward slashes (/), underscores (_), and dashes (-). The alias name cannot begin with alias/aws/. The alias/aws/ prefix is reserved for AWS managed CMKs.
        public let aliasName: String
        /// Associates the alias with the specified customer managed CMK. The CMK must be in the same AWS Region.  A valid CMK ID is required. If you supply a null or empty string value, this operation returns an error. For help finding the key ID and ARN, see Finding the Key ID and ARN in the AWS Key Management Service Developer Guide. Specify the key ID or the Amazon Resource Name (ARN) of the CMK. For example:   Key ID: 1234abcd-12ab-34cd-56ef-1234567890ab    Key ARN: arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab    To get the key ID and key ARN for a CMK, use ListKeys or DescribeKey.
        public let targetKeyId: String

        public init(aliasName: String, targetKeyId: String) {
            self.aliasName = aliasName
            self.targetKeyId = targetKeyId
        }

        public func validate(name: String) throws {
            try self.validate(self.aliasName, name: "aliasName", parent: name, max: 256)
            try self.validate(self.aliasName, name: "aliasName", parent: name, min: 1)
            try self.validate(self.aliasName, name: "aliasName", parent: name, pattern: "^[a-zA-Z0-9:/_-]+$")
            try self.validate(self.targetKeyId, name: "targetKeyId", parent: name, max: 2048)
            try self.validate(self.targetKeyId, name: "targetKeyId", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case aliasName = "AliasName"
            case targetKeyId = "TargetKeyId"
        }
    }

    public struct CreateCustomKeyStoreRequest: AWSEncodableShape {
        /// Identifies the AWS CloudHSM cluster for the custom key store. Enter the cluster ID of any active AWS CloudHSM cluster that is not already associated with a custom key store. To find the cluster ID, use the DescribeClusters operation.
        public let cloudHsmClusterId: String
        /// Specifies a friendly name for the custom key store. The name must be unique in your AWS account.
        public let customKeyStoreName: String
        /// Enter the password of the  kmsuser crypto user (CU) account in the specified AWS CloudHSM cluster. AWS KMS logs into the cluster as this user to manage key material on your behalf. The password must be a string of 7 to 32 characters. Its value is case sensitive. This parameter tells AWS KMS the kmsuser account password; it does not change the password in the AWS CloudHSM cluster.
        public let keyStorePassword: String
        /// Enter the content of the trust anchor certificate for the cluster. This is the content of the customerCA.crt file that you created when you initialized the cluster.
        public let trustAnchorCertificate: String

        public init(cloudHsmClusterId: String, customKeyStoreName: String, keyStorePassword: String, trustAnchorCertificate: String) {
            self.cloudHsmClusterId = cloudHsmClusterId
            self.customKeyStoreName = customKeyStoreName
            self.keyStorePassword = keyStorePassword
            self.trustAnchorCertificate = trustAnchorCertificate
        }

        public func validate(name: String) throws {
            try self.validate(self.cloudHsmClusterId, name: "cloudHsmClusterId", parent: name, max: 24)
            try self.validate(self.cloudHsmClusterId, name: "cloudHsmClusterId", parent: name, min: 19)
            try self.validate(self.customKeyStoreName, name: "customKeyStoreName", parent: name, max: 256)
            try self.validate(self.customKeyStoreName, name: "customKeyStoreName", parent: name, min: 1)
            try self.validate(self.keyStorePassword, name: "keyStorePassword", parent: name, max: 32)
            try self.validate(self.keyStorePassword, name: "keyStorePassword", parent: name, min: 7)
            try self.validate(self.trustAnchorCertificate, name: "trustAnchorCertificate", parent: name, max: 5000)
            try self.validate(self.trustAnchorCertificate, name: "trustAnchorCertificate", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case cloudHsmClusterId = "CloudHsmClusterId"
            case customKeyStoreName = "CustomKeyStoreName"
            case keyStorePassword = "KeyStorePassword"
            case trustAnchorCertificate = "TrustAnchorCertificate"
        }
    }

    public struct CreateCustomKeyStoreResponse: AWSDecodableShape {
        /// A unique identifier for the new custom key store.
        public let customKeyStoreId: String?

        public init(customKeyStoreId: String? = nil) {
            self.customKeyStoreId = customKeyStoreId
        }

        private enum CodingKeys: String, CodingKey {
            case customKeyStoreId = "CustomKeyStoreId"
        }
    }

    public struct CreateGrantRequest: AWSEncodableShape {
        /// Allows a cryptographic operation only when the encryption context matches or includes the encryption context specified in this structure. For more information about encryption context, see Encryption Context in the  AWS Key Management Service Developer Guide . Grant constraints are not applied to operations that do not support an encryption context, such as cryptographic operations with asymmetric CMKs and management operations, such as DescribeKey or RetireGrant.
        public let constraints: GrantConstraints?
        /// The principal that is given permission to perform the operations that the grant permits. To specify the principal, use the Amazon Resource Name (ARN) of an AWS principal. Valid AWS principals include AWS accounts (root), IAM users, IAM roles, federated users, and assumed role users. For examples of the ARN syntax to use for specifying a principal, see AWS Identity and Access Management (IAM) in the Example ARNs section of the AWS General Reference.
        public let granteePrincipal: String
        /// A list of grant tokens. For more information, see Grant Tokens in the AWS Key Management Service Developer Guide.
        public let grantTokens: [String]?
        /// The unique identifier for the customer master key (CMK) that the grant applies to. Specify the key ID or the Amazon Resource Name (ARN) of the CMK. To specify a CMK in a different AWS account, you must use the key ARN. For example:   Key ID: 1234abcd-12ab-34cd-56ef-1234567890ab    Key ARN: arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab    To get the key ID and key ARN for a CMK, use ListKeys or DescribeKey.
        public let keyId: String
        /// A friendly name for the grant. Use this value to prevent the unintended creation of duplicate grants when retrying this request. When this value is absent, all CreateGrant requests result in a new grant with a unique GrantId even if all the supplied parameters are identical. This can result in unintended duplicates when you retry the CreateGrant request. When this value is present, you can retry a CreateGrant request with identical parameters; if the grant already exists, the original GrantId is returned without creating a new grant. Note that the returned grant token is unique with every CreateGrant request, even when a duplicate GrantId is returned. All grant tokens for the same grant ID can be used interchangeably.
        public let name: String?
        /// A list of operations that the grant permits.
        public let operations: [GrantOperation]
        /// The principal that is given permission to retire the grant by using RetireGrant operation. To specify the principal, use the Amazon Resource Name (ARN) of an AWS principal. Valid AWS principals include AWS accounts (root), IAM users, federated users, and assumed role users. For examples of the ARN syntax to use for specifying a principal, see AWS Identity and Access Management (IAM) in the Example ARNs section of the AWS General Reference.
        public let retiringPrincipal: String?

        public init(constraints: GrantConstraints? = nil, granteePrincipal: String, grantTokens: [String]? = nil, keyId: String, name: String? = nil, operations: [GrantOperation], retiringPrincipal: String? = nil) {
            self.constraints = constraints
            self.granteePrincipal = granteePrincipal
            self.grantTokens = grantTokens
            self.keyId = keyId
            self.name = name
            self.operations = operations
            self.retiringPrincipal = retiringPrincipal
        }

        public func validate(name: String) throws {
            try self.validate(self.granteePrincipal, name: "granteePrincipal", parent: name, max: 256)
            try self.validate(self.granteePrincipal, name: "granteePrincipal", parent: name, min: 1)
            try self.validate(self.granteePrincipal, name: "granteePrincipal", parent: name, pattern: "^[\\w+=,.@:/-]+$")
            try self.grantTokens?.forEach {
                try validate($0, name: "grantTokens[]", parent: name, max: 8192)
                try validate($0, name: "grantTokens[]", parent: name, min: 1)
            }
            try self.validate(self.grantTokens, name: "grantTokens", parent: name, max: 10)
            try self.validate(self.grantTokens, name: "grantTokens", parent: name, min: 0)
            try self.validate(self.keyId, name: "keyId", parent: name, max: 2048)
            try self.validate(self.keyId, name: "keyId", parent: name, min: 1)
            try self.validate(self.name, name: "name", parent: name, max: 256)
            try self.validate(self.name, name: "name", parent: name, min: 1)
            try self.validate(self.name, name: "name", parent: name, pattern: "^[a-zA-Z0-9:/_-]+$")
            try self.validate(self.retiringPrincipal, name: "retiringPrincipal", parent: name, max: 256)
            try self.validate(self.retiringPrincipal, name: "retiringPrincipal", parent: name, min: 1)
            try self.validate(self.retiringPrincipal, name: "retiringPrincipal", parent: name, pattern: "^[\\w+=,.@:/-]+$")
        }

        private enum CodingKeys: String, CodingKey {
            case constraints = "Constraints"
            case granteePrincipal = "GranteePrincipal"
            case grantTokens = "GrantTokens"
            case keyId = "KeyId"
            case name = "Name"
            case operations = "Operations"
            case retiringPrincipal = "RetiringPrincipal"
        }
    }

    public struct CreateGrantResponse: AWSDecodableShape {
        /// The unique identifier for the grant. You can use the GrantId in a ListGrants, RetireGrant, or RevokeGrant operation.
        public let grantId: String?
        /// The grant token. For more information, see Grant Tokens in the AWS Key Management Service Developer Guide.
        public let grantToken: String?

        public init(grantId: String? = nil, grantToken: String? = nil) {
            self.grantId = grantId
            self.grantToken = grantToken
        }

        private enum CodingKeys: String, CodingKey {
            case grantId = "GrantId"
            case grantToken = "GrantToken"
        }
    }

    public struct CreateKeyRequest: AWSEncodableShape {
        /// A flag to indicate whether to bypass the key policy lockout safety check.  Setting this value to true increases the risk that the CMK becomes unmanageable. Do not set this value to true indiscriminately. For more information, refer to the scenario in the Default Key Policy section in the  AWS Key Management Service Developer Guide .  Use this parameter only when you include a policy in the request and you intend to prevent the principal that is making the request from making a subsequent PutKeyPolicy request on the CMK. The default value is false.
        public let bypassPolicyLockoutSafetyCheck: Bool?
        /// Specifies the type of CMK to create. The default value, SYMMETRIC_DEFAULT, creates a CMK with a 256-bit symmetric key for encryption and decryption. For help choosing a key spec for your CMK, see How to Choose Your CMK Configuration in the AWS Key Management Service Developer Guide. The CustomerMasterKeySpec determines whether the CMK contains a symmetric key or an asymmetric key pair. It also determines the encryption algorithms or signing algorithms that the CMK supports. You can't change the CustomerMasterKeySpec after the CMK is created. To further restrict the algorithms that can be used with the CMK, use a condition key in its key policy or IAM policy. For more information, see kms:EncryptionAlgorithm or kms:Signing Algorithm in the AWS Key Management Service Developer Guide.   AWS services that are integrated with AWS KMS use symmetric CMKs to protect your data. These services do not support asymmetric CMKs. For help determining whether a CMK is symmetric or asymmetric, see Identifying Symmetric and Asymmetric CMKs in the AWS Key Management Service Developer Guide.  AWS KMS supports the following key specs for CMKs:   Symmetric key (default)    SYMMETRIC_DEFAULT (AES-256-GCM)     Asymmetric RSA key pairs    RSA_2048     RSA_3072     RSA_4096      Asymmetric NIST-recommended elliptic curve key pairs    ECC_NIST_P256 (secp256r1)    ECC_NIST_P384 (secp384r1)    ECC_NIST_P521 (secp521r1)     Other asymmetric elliptic curve key pairs    ECC_SECG_P256K1 (secp256k1), commonly used for cryptocurrencies.
        public let customerMasterKeySpec: CustomerMasterKeySpec?
        /// Creates the CMK in the specified custom key store and the key material in its associated AWS CloudHSM cluster. To create a CMK in a custom key store, you must also specify the Origin parameter with a value of AWS_CLOUDHSM. The AWS CloudHSM cluster that is associated with the custom key store must have at least two active HSMs, each in a different Availability Zone in the Region. This parameter is valid only for symmetric CMKs. You cannot create an asymmetric CMK in a custom key store. To find the ID of a custom key store, use the DescribeCustomKeyStores operation. The response includes the custom key store ID and the ID of the AWS CloudHSM cluster. This operation is part of the Custom Key Store feature feature in AWS KMS, which combines the convenience and extensive integration of AWS KMS with the isolation and control of a single-tenant key store.
        public let customKeyStoreId: String?
        /// A description of the CMK. Use a description that helps you decide whether the CMK is appropriate for a task.
        public let description: String?
        /// Determines the cryptographic operations for which you can use the CMK. The default value is ENCRYPT_DECRYPT. This parameter is required only for asymmetric CMKs. You can't change the KeyUsage value after the CMK is created. Select only one valid value.   For symmetric CMKs, omit the parameter or specify ENCRYPT_DECRYPT.   For asymmetric CMKs with RSA key material, specify ENCRYPT_DECRYPT or SIGN_VERIFY.   For asymmetric CMKs with ECC key material, specify SIGN_VERIFY.
        public let keyUsage: KeyUsageType?
        /// The source of the key material for the CMK. You cannot change the origin after you create the CMK. The default is AWS_KMS, which means AWS KMS creates the key material. When the parameter value is EXTERNAL, AWS KMS creates a CMK without key material so that you can import key material from your existing key management infrastructure. For more information about importing key material into AWS KMS, see Importing Key Material in the AWS Key Management Service Developer Guide. This value is valid only for symmetric CMKs. When the parameter value is AWS_CLOUDHSM, AWS KMS creates the CMK in an AWS KMS custom key store and creates its key material in the associated AWS CloudHSM cluster. You must also use the CustomKeyStoreId parameter to identify the custom key store. This value is valid only for symmetric CMKs.
        public let origin: OriginType?
        /// The key policy to attach to the CMK. If you provide a key policy, it must meet the following criteria:   If you don't set BypassPolicyLockoutSafetyCheck to true, the key policy must allow the principal that is making the CreateKey request to make a subsequent PutKeyPolicy request on the CMK. This reduces the risk that the CMK becomes unmanageable. For more information, refer to the scenario in the Default Key Policy section of the  AWS Key Management Service Developer Guide .   Each statement in the key policy must contain one or more principals. The principals in the key policy must exist and be visible to AWS KMS. When you create a new AWS principal (for example, an IAM user or role), you might need to enforce a delay before including the new principal in a key policy because the new principal might not be immediately visible to AWS KMS. For more information, see Changes that I make are not always immediately visible in the AWS Identity and Access Management User Guide.   If you do not provide a key policy, AWS KMS attaches a default key policy to the CMK. For more information, see Default Key Policy in the AWS Key Management Service Developer Guide.  The key policy size quota is 32 kilobytes (32768 bytes). For help writing and formatting a JSON policy document, see the IAM JSON Policy Reference in the  IAM User Guide .
        public let policy: String?
        /// One or more tags. Each tag consists of a tag key and a tag value. Both the tag key and the tag value are required, but the tag value can be an empty (null) string.  When you add tags to an AWS resource, AWS generates a cost allocation report with usage and costs aggregated by tags. For information about adding, changing, deleting and listing tags for CMKs, see Tagging Keys. Use this parameter to tag the CMK when it is created. To add tags to an existing CMK, use the TagResource operation. To use this parameter, you must have kms:TagResource permission in an IAM policy.
        public let tags: [Tag]?

        public init(bypassPolicyLockoutSafetyCheck: Bool? = nil, customerMasterKeySpec: CustomerMasterKeySpec? = nil, customKeyStoreId: String? = nil, description: String? = nil, keyUsage: KeyUsageType? = nil, origin: OriginType? = nil, policy: String? = nil, tags: [Tag]? = nil) {
            self.bypassPolicyLockoutSafetyCheck = bypassPolicyLockoutSafetyCheck
            self.customerMasterKeySpec = customerMasterKeySpec
            self.customKeyStoreId = customKeyStoreId
            self.description = description
            self.keyUsage = keyUsage
            self.origin = origin
            self.policy = policy
            self.tags = tags
        }

        public func validate(name: String) throws {
            try self.validate(self.customKeyStoreId, name: "customKeyStoreId", parent: name, max: 64)
            try self.validate(self.customKeyStoreId, name: "customKeyStoreId", parent: name, min: 1)
            try self.validate(self.description, name: "description", parent: name, max: 8192)
            try self.validate(self.description, name: "description", parent: name, min: 0)
            try self.validate(self.policy, name: "policy", parent: name, max: 131_072)
            try self.validate(self.policy, name: "policy", parent: name, min: 1)
            try self.validate(self.policy, name: "policy", parent: name, pattern: "[\\u0009\\u000A\\u000D\\u0020-\\u00FF]+")
            try self.tags?.forEach {
                try $0.validate(name: "\(name).tags[]")
            }
        }

        private enum CodingKeys: String, CodingKey {
            case bypassPolicyLockoutSafetyCheck = "BypassPolicyLockoutSafetyCheck"
            case customerMasterKeySpec = "CustomerMasterKeySpec"
            case customKeyStoreId = "CustomKeyStoreId"
            case description = "Description"
            case keyUsage = "KeyUsage"
            case origin = "Origin"
            case policy = "Policy"
            case tags = "Tags"
        }
    }

    public struct CreateKeyResponse: AWSDecodableShape {
        /// Metadata associated with the CMK.
        public let keyMetadata: KeyMetadata?

        public init(keyMetadata: KeyMetadata? = nil) {
            self.keyMetadata = keyMetadata
        }

        private enum CodingKeys: String, CodingKey {
            case keyMetadata = "KeyMetadata"
        }
    }

    public struct CustomKeyStoresListEntry: AWSDecodableShape {
        /// A unique identifier for the AWS CloudHSM cluster that is associated with the custom key store.
        public let cloudHsmClusterId: String?
        /// Describes the connection error. This field appears in the response only when the ConnectionState is FAILED. For help resolving these errors, see How to Fix a Connection Failure in AWS Key Management Service Developer Guide. Valid values are:    CLUSTER_NOT_FOUND - AWS KMS cannot find the AWS CloudHSM cluster with the specified cluster ID.    INSUFFICIENT_CLOUDHSM_HSMS - The associated AWS CloudHSM cluster does not contain any active HSMs. To connect a custom key store to its AWS CloudHSM cluster, the cluster must contain at least one active HSM.    INTERNAL_ERROR - AWS KMS could not complete the request due to an internal error. Retry the request. For ConnectCustomKeyStore requests, disconnect the custom key store before trying to connect again.    INVALID_CREDENTIALS - AWS KMS does not have the correct password for the kmsuser crypto user in the AWS CloudHSM cluster. Before you can connect your custom key store to its AWS CloudHSM cluster, you must change the kmsuser account password and update the key store password value for the custom key store.    NETWORK_ERRORS - Network errors are preventing AWS KMS from connecting to the custom key store.    SUBNET_NOT_FOUND - A subnet in the AWS CloudHSM cluster configuration was deleted. If AWS KMS cannot find all of the subnets in the cluster configuration, attempts to connect the custom key store to the AWS CloudHSM cluster fail. To fix this error, create a cluster from a recent backup and associate it with your custom key store. (This process creates a new cluster configuration with a VPC and private subnets.) For details, see How to Fix a Connection Failure in the AWS Key Management Service Developer Guide.    USER_LOCKED_OUT - The kmsuser CU account is locked out of the associated AWS CloudHSM cluster due to too many failed password attempts. Before you can connect your custom key store to its AWS CloudHSM cluster, you must change the kmsuser account password and update the key store password value for the custom key store.    USER_LOGGED_IN - The kmsuser CU account is logged into the the associated AWS CloudHSM cluster. This prevents AWS KMS from rotating the kmsuser account password and logging into the cluster. Before you can connect your custom key store to its AWS CloudHSM cluster, you must log the kmsuser CU out of the cluster. If you changed the kmsuser password to log into the cluster, you must also and update the key store password value for the custom key store. For help, see How to Log Out and Reconnect in the AWS Key Management Service Developer Guide.    USER_NOT_FOUND - AWS KMS cannot find a kmsuser CU account in the associated AWS CloudHSM cluster. Before you can connect your custom key store to its AWS CloudHSM cluster, you must create a kmsuser CU account in the cluster, and then update the key store password value for the custom key store.
        public let connectionErrorCode: ConnectionErrorCodeType?
        /// Indicates whether the custom key store is connected to its AWS CloudHSM cluster. You can create and use CMKs in your custom key stores only when its connection state is CONNECTED. The value is DISCONNECTED if the key store has never been connected or you use the DisconnectCustomKeyStore operation to disconnect it. If the value is CONNECTED but you are having trouble using the custom key store, make sure that its associated AWS CloudHSM cluster is active and contains at least one active HSM. A value of FAILED indicates that an attempt to connect was unsuccessful. The ConnectionErrorCode field in the response indicates the cause of the failure. For help resolving a connection failure, see Troubleshooting a Custom Key Store in the AWS Key Management Service Developer Guide.
        public let connectionState: ConnectionStateType?
        /// The date and time when the custom key store was created.
        public let creationDate: Date?
        /// A unique identifier for the custom key store.
        public let customKeyStoreId: String?
        /// The user-specified friendly name for the custom key store.
        public let customKeyStoreName: String?
        /// The trust anchor certificate of the associated AWS CloudHSM cluster. When you initialize the cluster, you create this certificate and save it in the customerCA.crt file.
        public let trustAnchorCertificate: String?

        public init(cloudHsmClusterId: String? = nil, connectionErrorCode: ConnectionErrorCodeType? = nil, connectionState: ConnectionStateType? = nil, creationDate: Date? = nil, customKeyStoreId: String? = nil, customKeyStoreName: String? = nil, trustAnchorCertificate: String? = nil) {
            self.cloudHsmClusterId = cloudHsmClusterId
            self.connectionErrorCode = connectionErrorCode
            self.connectionState = connectionState
            self.creationDate = creationDate
            self.customKeyStoreId = customKeyStoreId
            self.customKeyStoreName = customKeyStoreName
            self.trustAnchorCertificate = trustAnchorCertificate
        }

        private enum CodingKeys: String, CodingKey {
            case cloudHsmClusterId = "CloudHsmClusterId"
            case connectionErrorCode = "ConnectionErrorCode"
            case connectionState = "ConnectionState"
            case creationDate = "CreationDate"
            case customKeyStoreId = "CustomKeyStoreId"
            case customKeyStoreName = "CustomKeyStoreName"
            case trustAnchorCertificate = "TrustAnchorCertificate"
        }
    }

    public struct DecryptRequest: AWSEncodableShape {
        /// Ciphertext to be decrypted. The blob includes metadata.
        public let ciphertextBlob: Data
        /// Specifies the encryption algorithm that will be used to decrypt the ciphertext. Specify the same algorithm that was used to encrypt the data. If you specify a different algorithm, the Decrypt operation fails. This parameter is required only when the ciphertext was encrypted under an asymmetric CMK. The default value, SYMMETRIC_DEFAULT, represents the only supported algorithm that is valid for symmetric CMKs.
        public let encryptionAlgorithm: EncryptionAlgorithmSpec?
        /// Specifies the encryption context to use when decrypting the data. An encryption context is valid only for cryptographic operations with a symmetric CMK. The standard asymmetric encryption algorithms that AWS KMS uses do not support an encryption context. An encryption context is a collection of non-secret key-value pairs that represents additional authenticated data. When you use an encryption context to encrypt data, you must specify the same (an exact case-sensitive match) encryption context to decrypt the data. An encryption context is optional when encrypting with a symmetric CMK, but it is highly recommended. For more information, see Encryption Context in the AWS Key Management Service Developer Guide.
        public let encryptionContext: [String: String]?
        /// A list of grant tokens. For more information, see Grant Tokens in the AWS Key Management Service Developer Guide.
        public let grantTokens: [String]?
        /// Specifies the customer master key (CMK) that AWS KMS uses to decrypt the ciphertext. Enter a key ID of the CMK that was used to encrypt the ciphertext. This parameter is required only when the ciphertext was encrypted under an asymmetric CMK. If you used a symmetric CMK, AWS KMS can get the CMK from metadata that it adds to the symmetric ciphertext blob. However, it is always recommended as a best practice. This practice ensures that you use the CMK that you intend. To specify a CMK, use its key ID, Amazon Resource Name (ARN), alias name, or alias ARN. When using an alias name, prefix it with "alias/". To specify a CMK in a different AWS account, you must use the key ARN or alias ARN. For example:   Key ID: 1234abcd-12ab-34cd-56ef-1234567890ab    Key ARN: arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab    Alias name: alias/ExampleAlias    Alias ARN: arn:aws:kms:us-east-2:111122223333:alias/ExampleAlias    To get the key ID and key ARN for a CMK, use ListKeys or DescribeKey. To get the alias name and alias ARN, use ListAliases.
        public let keyId: String?

        public init(ciphertextBlob: Data, encryptionAlgorithm: EncryptionAlgorithmSpec? = nil, encryptionContext: [String: String]? = nil, grantTokens: [String]? = nil, keyId: String? = nil) {
            self.ciphertextBlob = ciphertextBlob
            self.encryptionAlgorithm = encryptionAlgorithm
            self.encryptionContext = encryptionContext
            self.grantTokens = grantTokens
            self.keyId = keyId
        }

        public func validate(name: String) throws {
            try self.validate(self.ciphertextBlob, name: "ciphertextBlob", parent: name, max: 6144)
            try self.validate(self.ciphertextBlob, name: "ciphertextBlob", parent: name, min: 1)
            try self.grantTokens?.forEach {
                try validate($0, name: "grantTokens[]", parent: name, max: 8192)
                try validate($0, name: "grantTokens[]", parent: name, min: 1)
            }
            try self.validate(self.grantTokens, name: "grantTokens", parent: name, max: 10)
            try self.validate(self.grantTokens, name: "grantTokens", parent: name, min: 0)
            try self.validate(self.keyId, name: "keyId", parent: name, max: 2048)
            try self.validate(self.keyId, name: "keyId", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case ciphertextBlob = "CiphertextBlob"
            case encryptionAlgorithm = "EncryptionAlgorithm"
            case encryptionContext = "EncryptionContext"
            case grantTokens = "GrantTokens"
            case keyId = "KeyId"
        }
    }

    public struct DecryptResponse: AWSDecodableShape {
        /// The encryption algorithm that was used to decrypt the ciphertext.
        public let encryptionAlgorithm: EncryptionAlgorithmSpec?
        /// The Amazon Resource Name (key ARN) of the CMK that was used to decrypt the ciphertext.
        public let keyId: String?
        /// Decrypted plaintext data. When you use the HTTP API or the AWS CLI, the value is Base64-encoded. Otherwise, it is not Base64-encoded.
        public let plaintext: Data?

        public init(encryptionAlgorithm: EncryptionAlgorithmSpec? = nil, keyId: String? = nil, plaintext: Data? = nil) {
            self.encryptionAlgorithm = encryptionAlgorithm
            self.keyId = keyId
            self.plaintext = plaintext
        }

        private enum CodingKeys: String, CodingKey {
            case encryptionAlgorithm = "EncryptionAlgorithm"
            case keyId = "KeyId"
            case plaintext = "Plaintext"
        }
    }

    public struct DeleteAliasRequest: AWSEncodableShape {
        /// The alias to be deleted. The alias name must begin with alias/ followed by the alias name, such as alias/ExampleAlias.
        public let aliasName: String

        public init(aliasName: String) {
            self.aliasName = aliasName
        }

        public func validate(name: String) throws {
            try self.validate(self.aliasName, name: "aliasName", parent: name, max: 256)
            try self.validate(self.aliasName, name: "aliasName", parent: name, min: 1)
            try self.validate(self.aliasName, name: "aliasName", parent: name, pattern: "^[a-zA-Z0-9:/_-]+$")
        }

        private enum CodingKeys: String, CodingKey {
            case aliasName = "AliasName"
        }
    }

    public struct DeleteCustomKeyStoreRequest: AWSEncodableShape {
        /// Enter the ID of the custom key store you want to delete. To find the ID of a custom key store, use the DescribeCustomKeyStores operation.
        public let customKeyStoreId: String

        public init(customKeyStoreId: String) {
            self.customKeyStoreId = customKeyStoreId
        }

        public func validate(name: String) throws {
            try self.validate(self.customKeyStoreId, name: "customKeyStoreId", parent: name, max: 64)
            try self.validate(self.customKeyStoreId, name: "customKeyStoreId", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case customKeyStoreId = "CustomKeyStoreId"
        }
    }

    public struct DeleteCustomKeyStoreResponse: AWSDecodableShape {
        public init() {}
    }

    public struct DeleteImportedKeyMaterialRequest: AWSEncodableShape {
        /// Identifies the CMK from which you are deleting imported key material. The Origin of the CMK must be EXTERNAL. Specify the key ID or the Amazon Resource Name (ARN) of the CMK. For example:   Key ID: 1234abcd-12ab-34cd-56ef-1234567890ab    Key ARN: arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab    To get the key ID and key ARN for a CMK, use ListKeys or DescribeKey.
        public let keyId: String

        public init(keyId: String) {
            self.keyId = keyId
        }

        public func validate(name: String) throws {
            try self.validate(self.keyId, name: "keyId", parent: name, max: 2048)
            try self.validate(self.keyId, name: "keyId", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case keyId = "KeyId"
        }
    }

    public struct DescribeCustomKeyStoresRequest: AWSEncodableShape {
        /// Gets only information about the specified custom key store. Enter the key store ID. By default, this operation gets information about all custom key stores in the account and region. To limit the output to a particular custom key store, you can use either the CustomKeyStoreId or CustomKeyStoreName parameter, but not both.
        public let customKeyStoreId: String?
        /// Gets only information about the specified custom key store. Enter the friendly name of the custom key store. By default, this operation gets information about all custom key stores in the account and region. To limit the output to a particular custom key store, you can use either the CustomKeyStoreId or CustomKeyStoreName parameter, but not both.
        public let customKeyStoreName: String?
        /// Use this parameter to specify the maximum number of items to return. When this value is present, AWS KMS does not return more than the specified number of items, but it might return fewer.
        public let limit: Int?
        /// Use this parameter in a subsequent request after you receive a response with truncated results. Set it to the value of NextMarker from the truncated response you just received.
        public let marker: String?

        public init(customKeyStoreId: String? = nil, customKeyStoreName: String? = nil, limit: Int? = nil, marker: String? = nil) {
            self.customKeyStoreId = customKeyStoreId
            self.customKeyStoreName = customKeyStoreName
            self.limit = limit
            self.marker = marker
        }

        public func validate(name: String) throws {
            try self.validate(self.customKeyStoreId, name: "customKeyStoreId", parent: name, max: 64)
            try self.validate(self.customKeyStoreId, name: "customKeyStoreId", parent: name, min: 1)
            try self.validate(self.customKeyStoreName, name: "customKeyStoreName", parent: name, max: 256)
            try self.validate(self.customKeyStoreName, name: "customKeyStoreName", parent: name, min: 1)
            try self.validate(self.limit, name: "limit", parent: name, max: 1000)
            try self.validate(self.limit, name: "limit", parent: name, min: 1)
            try self.validate(self.marker, name: "marker", parent: name, max: 1024)
            try self.validate(self.marker, name: "marker", parent: name, min: 1)
            try self.validate(self.marker, name: "marker", parent: name, pattern: "[\\u0020-\\u00FF]*")
        }

        private enum CodingKeys: String, CodingKey {
            case customKeyStoreId = "CustomKeyStoreId"
            case customKeyStoreName = "CustomKeyStoreName"
            case limit = "Limit"
            case marker = "Marker"
        }
    }

    public struct DescribeCustomKeyStoresResponse: AWSDecodableShape {
        /// Contains metadata about each custom key store.
        public let customKeyStores: [CustomKeyStoresListEntry]?
        /// When Truncated is true, this element is present and contains the value to use for the Marker parameter in a subsequent request.
        public let nextMarker: String?
        /// A flag that indicates whether there are more items in the list. When this value is true, the list in this response is truncated. To get more items, pass the value of the NextMarker element in thisresponse to the Marker parameter in a subsequent request.
        public let truncated: Bool?

        public init(customKeyStores: [CustomKeyStoresListEntry]? = nil, nextMarker: String? = nil, truncated: Bool? = nil) {
            self.customKeyStores = customKeyStores
            self.nextMarker = nextMarker
            self.truncated = truncated
        }

        private enum CodingKeys: String, CodingKey {
            case customKeyStores = "CustomKeyStores"
            case nextMarker = "NextMarker"
            case truncated = "Truncated"
        }
    }

    public struct DescribeKeyRequest: AWSEncodableShape {
        /// A list of grant tokens. For more information, see Grant Tokens in the AWS Key Management Service Developer Guide.
        public let grantTokens: [String]?
        /// Describes the specified customer master key (CMK).  If you specify a predefined AWS alias (an AWS alias with no key ID), KMS associates the alias with an AWS managed CMK and returns its KeyId and Arn in the response. To specify a CMK, use its key ID, Amazon Resource Name (ARN), alias name, or alias ARN. When using an alias name, prefix it with "alias/". To specify a CMK in a different AWS account, you must use the key ARN or alias ARN. For example:   Key ID: 1234abcd-12ab-34cd-56ef-1234567890ab    Key ARN: arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab    Alias name: alias/ExampleAlias    Alias ARN: arn:aws:kms:us-east-2:111122223333:alias/ExampleAlias    To get the key ID and key ARN for a CMK, use ListKeys or DescribeKey. To get the alias name and alias ARN, use ListAliases.
        public let keyId: String

        public init(grantTokens: [String]? = nil, keyId: String) {
            self.grantTokens = grantTokens
            self.keyId = keyId
        }

        public func validate(name: String) throws {
            try self.grantTokens?.forEach {
                try validate($0, name: "grantTokens[]", parent: name, max: 8192)
                try validate($0, name: "grantTokens[]", parent: name, min: 1)
            }
            try self.validate(self.grantTokens, name: "grantTokens", parent: name, max: 10)
            try self.validate(self.grantTokens, name: "grantTokens", parent: name, min: 0)
            try self.validate(self.keyId, name: "keyId", parent: name, max: 2048)
            try self.validate(self.keyId, name: "keyId", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case grantTokens = "GrantTokens"
            case keyId = "KeyId"
        }
    }

    public struct DescribeKeyResponse: AWSDecodableShape {
        /// Metadata associated with the key.
        public let keyMetadata: KeyMetadata?

        public init(keyMetadata: KeyMetadata? = nil) {
            self.keyMetadata = keyMetadata
        }

        private enum CodingKeys: String, CodingKey {
            case keyMetadata = "KeyMetadata"
        }
    }

    public struct DisableKeyRequest: AWSEncodableShape {
        /// A unique identifier for the customer master key (CMK). Specify the key ID or the Amazon Resource Name (ARN) of the CMK. For example:   Key ID: 1234abcd-12ab-34cd-56ef-1234567890ab    Key ARN: arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab    To get the key ID and key ARN for a CMK, use ListKeys or DescribeKey.
        public let keyId: String

        public init(keyId: String) {
            self.keyId = keyId
        }

        public func validate(name: String) throws {
            try self.validate(self.keyId, name: "keyId", parent: name, max: 2048)
            try self.validate(self.keyId, name: "keyId", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case keyId = "KeyId"
        }
    }

    public struct DisableKeyRotationRequest: AWSEncodableShape {
        /// Identifies a symmetric customer master key (CMK). You cannot enable or disable automatic rotation of asymmetric CMKs, CMKs with imported key material, or CMKs in a custom key store. Specify the key ID or the Amazon Resource Name (ARN) of the CMK. For example:   Key ID: 1234abcd-12ab-34cd-56ef-1234567890ab    Key ARN: arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab    To get the key ID and key ARN for a CMK, use ListKeys or DescribeKey.
        public let keyId: String

        public init(keyId: String) {
            self.keyId = keyId
        }

        public func validate(name: String) throws {
            try self.validate(self.keyId, name: "keyId", parent: name, max: 2048)
            try self.validate(self.keyId, name: "keyId", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case keyId = "KeyId"
        }
    }

    public struct DisconnectCustomKeyStoreRequest: AWSEncodableShape {
        /// Enter the ID of the custom key store you want to disconnect. To find the ID of a custom key store, use the DescribeCustomKeyStores operation.
        public let customKeyStoreId: String

        public init(customKeyStoreId: String) {
            self.customKeyStoreId = customKeyStoreId
        }

        public func validate(name: String) throws {
            try self.validate(self.customKeyStoreId, name: "customKeyStoreId", parent: name, max: 64)
            try self.validate(self.customKeyStoreId, name: "customKeyStoreId", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case customKeyStoreId = "CustomKeyStoreId"
        }
    }

    public struct DisconnectCustomKeyStoreResponse: AWSDecodableShape {
        public init() {}
    }

    public struct EnableKeyRequest: AWSEncodableShape {
        /// A unique identifier for the customer master key (CMK). Specify the key ID or the Amazon Resource Name (ARN) of the CMK. For example:   Key ID: 1234abcd-12ab-34cd-56ef-1234567890ab    Key ARN: arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab    To get the key ID and key ARN for a CMK, use ListKeys or DescribeKey.
        public let keyId: String

        public init(keyId: String) {
            self.keyId = keyId
        }

        public func validate(name: String) throws {
            try self.validate(self.keyId, name: "keyId", parent: name, max: 2048)
            try self.validate(self.keyId, name: "keyId", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case keyId = "KeyId"
        }
    }

    public struct EnableKeyRotationRequest: AWSEncodableShape {
        /// Identifies a symmetric customer master key (CMK). You cannot enable automatic rotation of asymmetric CMKs, CMKs with imported key material, or CMKs in a custom key store. Specify the key ID or the Amazon Resource Name (ARN) of the CMK. For example:   Key ID: 1234abcd-12ab-34cd-56ef-1234567890ab    Key ARN: arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab    To get the key ID and key ARN for a CMK, use ListKeys or DescribeKey.
        public let keyId: String

        public init(keyId: String) {
            self.keyId = keyId
        }

        public func validate(name: String) throws {
            try self.validate(self.keyId, name: "keyId", parent: name, max: 2048)
            try self.validate(self.keyId, name: "keyId", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case keyId = "KeyId"
        }
    }

    public struct EncryptRequest: AWSEncodableShape {
        /// Specifies the encryption algorithm that AWS KMS will use to encrypt the plaintext message. The algorithm must be compatible with the CMK that you specify. This parameter is required only for asymmetric CMKs. The default value, SYMMETRIC_DEFAULT, is the algorithm used for symmetric CMKs. If you are using an asymmetric CMK, we recommend RSAES_OAEP_SHA_256.
        public let encryptionAlgorithm: EncryptionAlgorithmSpec?
        /// Specifies the encryption context that will be used to encrypt the data. An encryption context is valid only for cryptographic operations with a symmetric CMK. The standard asymmetric encryption algorithms that AWS KMS uses do not support an encryption context.  An encryption context is a collection of non-secret key-value pairs that represents additional authenticated data. When you use an encryption context to encrypt data, you must specify the same (an exact case-sensitive match) encryption context to decrypt the data. An encryption context is optional when encrypting with a symmetric CMK, but it is highly recommended. For more information, see Encryption Context in the AWS Key Management Service Developer Guide.
        public let encryptionContext: [String: String]?
        /// A list of grant tokens. For more information, see Grant Tokens in the AWS Key Management Service Developer Guide.
        public let grantTokens: [String]?
        /// A unique identifier for the customer master key (CMK). To specify a CMK, use its key ID, Amazon Resource Name (ARN), alias name, or alias ARN. When using an alias name, prefix it with "alias/". To specify a CMK in a different AWS account, you must use the key ARN or alias ARN. For example:   Key ID: 1234abcd-12ab-34cd-56ef-1234567890ab    Key ARN: arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab    Alias name: alias/ExampleAlias    Alias ARN: arn:aws:kms:us-east-2:111122223333:alias/ExampleAlias    To get the key ID and key ARN for a CMK, use ListKeys or DescribeKey. To get the alias name and alias ARN, use ListAliases.
        public let keyId: String
        /// Data to be encrypted.
        public let plaintext: Data

        public init(encryptionAlgorithm: EncryptionAlgorithmSpec? = nil, encryptionContext: [String: String]? = nil, grantTokens: [String]? = nil, keyId: String, plaintext: Data) {
            self.encryptionAlgorithm = encryptionAlgorithm
            self.encryptionContext = encryptionContext
            self.grantTokens = grantTokens
            self.keyId = keyId
            self.plaintext = plaintext
        }

        public func validate(name: String) throws {
            try self.grantTokens?.forEach {
                try validate($0, name: "grantTokens[]", parent: name, max: 8192)
                try validate($0, name: "grantTokens[]", parent: name, min: 1)
            }
            try self.validate(self.grantTokens, name: "grantTokens", parent: name, max: 10)
            try self.validate(self.grantTokens, name: "grantTokens", parent: name, min: 0)
            try self.validate(self.keyId, name: "keyId", parent: name, max: 2048)
            try self.validate(self.keyId, name: "keyId", parent: name, min: 1)
            try self.validate(self.plaintext, name: "plaintext", parent: name, max: 4096)
            try self.validate(self.plaintext, name: "plaintext", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case encryptionAlgorithm = "EncryptionAlgorithm"
            case encryptionContext = "EncryptionContext"
            case grantTokens = "GrantTokens"
            case keyId = "KeyId"
            case plaintext = "Plaintext"
        }
    }

    public struct EncryptResponse: AWSDecodableShape {
        /// The encrypted plaintext. When you use the HTTP API or the AWS CLI, the value is Base64-encoded. Otherwise, it is not Base64-encoded.
        public let ciphertextBlob: Data?
        /// The encryption algorithm that was used to encrypt the plaintext.
        public let encryptionAlgorithm: EncryptionAlgorithmSpec?
        /// The Amazon Resource Name (key ARN) of the CMK that was used to encrypt the plaintext.
        public let keyId: String?

        public init(ciphertextBlob: Data? = nil, encryptionAlgorithm: EncryptionAlgorithmSpec? = nil, keyId: String? = nil) {
            self.ciphertextBlob = ciphertextBlob
            self.encryptionAlgorithm = encryptionAlgorithm
            self.keyId = keyId
        }

        private enum CodingKeys: String, CodingKey {
            case ciphertextBlob = "CiphertextBlob"
            case encryptionAlgorithm = "EncryptionAlgorithm"
            case keyId = "KeyId"
        }
    }

    public struct GenerateDataKeyPairRequest: AWSEncodableShape {
        /// Specifies the encryption context that will be used when encrypting the private key in the data key pair. An encryption context is a collection of non-secret key-value pairs that represents additional authenticated data. When you use an encryption context to encrypt data, you must specify the same (an exact case-sensitive match) encryption context to decrypt the data. An encryption context is optional when encrypting with a symmetric CMK, but it is highly recommended. For more information, see Encryption Context in the AWS Key Management Service Developer Guide.
        public let encryptionContext: [String: String]?
        /// A list of grant tokens. For more information, see Grant Tokens in the AWS Key Management Service Developer Guide.
        public let grantTokens: [String]?
        /// Specifies the symmetric CMK that encrypts the private key in the data key pair. You cannot specify an asymmetric CMK or a CMK in a custom key store. To get the type and origin of your CMK, use the DescribeKey operation. To specify a CMK, use its key ID, Amazon Resource Name (ARN), alias name, or alias ARN. When using an alias name, prefix it with "alias/". To specify a CMK in a different AWS account, you must use the key ARN or alias ARN. For example:   Key ID: 1234abcd-12ab-34cd-56ef-1234567890ab    Key ARN: arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab    Alias name: alias/ExampleAlias    Alias ARN: arn:aws:kms:us-east-2:111122223333:alias/ExampleAlias    To get the key ID and key ARN for a CMK, use ListKeys or DescribeKey. To get the alias name and alias ARN, use ListAliases.
        public let keyId: String
        /// Determines the type of data key pair that is generated.  The AWS KMS rule that restricts the use of asymmetric RSA CMKs to encrypt and decrypt or to sign and verify (but not both), and the rule that permits you to use ECC CMKs only to sign and verify, are not effective outside of AWS KMS.
        public let keyPairSpec: DataKeyPairSpec

        public init(encryptionContext: [String: String]? = nil, grantTokens: [String]? = nil, keyId: String, keyPairSpec: DataKeyPairSpec) {
            self.encryptionContext = encryptionContext
            self.grantTokens = grantTokens
            self.keyId = keyId
            self.keyPairSpec = keyPairSpec
        }

        public func validate(name: String) throws {
            try self.grantTokens?.forEach {
                try validate($0, name: "grantTokens[]", parent: name, max: 8192)
                try validate($0, name: "grantTokens[]", parent: name, min: 1)
            }
            try self.validate(self.grantTokens, name: "grantTokens", parent: name, max: 10)
            try self.validate(self.grantTokens, name: "grantTokens", parent: name, min: 0)
            try self.validate(self.keyId, name: "keyId", parent: name, max: 2048)
            try self.validate(self.keyId, name: "keyId", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case encryptionContext = "EncryptionContext"
            case grantTokens = "GrantTokens"
            case keyId = "KeyId"
            case keyPairSpec = "KeyPairSpec"
        }
    }

    public struct GenerateDataKeyPairResponse: AWSDecodableShape {
        /// The Amazon Resource Name (key ARN) of the CMK that encrypted the private key.
        public let keyId: String?
        /// The type of data key pair that was generated.
        public let keyPairSpec: DataKeyPairSpec?
        /// The encrypted copy of the private key. When you use the HTTP API or the AWS CLI, the value is Base64-encoded. Otherwise, it is not Base64-encoded.
        public let privateKeyCiphertextBlob: Data?
        /// The plaintext copy of the private key. When you use the HTTP API or the AWS CLI, the value is Base64-encoded. Otherwise, it is not Base64-encoded.
        public let privateKeyPlaintext: Data?
        /// The public key (in plaintext).
        public let publicKey: Data?

        public init(keyId: String? = nil, keyPairSpec: DataKeyPairSpec? = nil, privateKeyCiphertextBlob: Data? = nil, privateKeyPlaintext: Data? = nil, publicKey: Data? = nil) {
            self.keyId = keyId
            self.keyPairSpec = keyPairSpec
            self.privateKeyCiphertextBlob = privateKeyCiphertextBlob
            self.privateKeyPlaintext = privateKeyPlaintext
            self.publicKey = publicKey
        }

        private enum CodingKeys: String, CodingKey {
            case keyId = "KeyId"
            case keyPairSpec = "KeyPairSpec"
            case privateKeyCiphertextBlob = "PrivateKeyCiphertextBlob"
            case privateKeyPlaintext = "PrivateKeyPlaintext"
            case publicKey = "PublicKey"
        }
    }

    public struct GenerateDataKeyPairWithoutPlaintextRequest: AWSEncodableShape {
        /// Specifies the encryption context that will be used when encrypting the private key in the data key pair. An encryption context is a collection of non-secret key-value pairs that represents additional authenticated data. When you use an encryption context to encrypt data, you must specify the same (an exact case-sensitive match) encryption context to decrypt the data. An encryption context is optional when encrypting with a symmetric CMK, but it is highly recommended. For more information, see Encryption Context in the AWS Key Management Service Developer Guide.
        public let encryptionContext: [String: String]?
        /// A list of grant tokens. For more information, see Grant Tokens in the AWS Key Management Service Developer Guide.
        public let grantTokens: [String]?
        /// Specifies the CMK that encrypts the private key in the data key pair. You must specify a symmetric CMK. You cannot use an asymmetric CMK or a CMK in a custom key store. To get the type and origin of your CMK, use the DescribeKey operation.  To specify a CMK, use its key ID, Amazon Resource Name (ARN), alias name, or alias ARN. When using an alias name, prefix it with "alias/". To specify a CMK in a different AWS account, you must use the key ARN or alias ARN. For example:   Key ID: 1234abcd-12ab-34cd-56ef-1234567890ab    Key ARN: arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab    Alias name: alias/ExampleAlias    Alias ARN: arn:aws:kms:us-east-2:111122223333:alias/ExampleAlias    To get the key ID and key ARN for a CMK, use ListKeys or DescribeKey. To get the alias name and alias ARN, use ListAliases.
        public let keyId: String
        /// Determines the type of data key pair that is generated. The AWS KMS rule that restricts the use of asymmetric RSA CMKs to encrypt and decrypt or to sign and verify (but not both), and the rule that permits you to use ECC CMKs only to sign and verify, are not effective outside of AWS KMS.
        public let keyPairSpec: DataKeyPairSpec

        public init(encryptionContext: [String: String]? = nil, grantTokens: [String]? = nil, keyId: String, keyPairSpec: DataKeyPairSpec) {
            self.encryptionContext = encryptionContext
            self.grantTokens = grantTokens
            self.keyId = keyId
            self.keyPairSpec = keyPairSpec
        }

        public func validate(name: String) throws {
            try self.grantTokens?.forEach {
                try validate($0, name: "grantTokens[]", parent: name, max: 8192)
                try validate($0, name: "grantTokens[]", parent: name, min: 1)
            }
            try self.validate(self.grantTokens, name: "grantTokens", parent: name, max: 10)
            try self.validate(self.grantTokens, name: "grantTokens", parent: name, min: 0)
            try self.validate(self.keyId, name: "keyId", parent: name, max: 2048)
            try self.validate(self.keyId, name: "keyId", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case encryptionContext = "EncryptionContext"
            case grantTokens = "GrantTokens"
            case keyId = "KeyId"
            case keyPairSpec = "KeyPairSpec"
        }
    }

    public struct GenerateDataKeyPairWithoutPlaintextResponse: AWSDecodableShape {
        /// The Amazon Resource Name (key ARN) of the CMK that encrypted the private key.
        public let keyId: String?
        /// The type of data key pair that was generated.
        public let keyPairSpec: DataKeyPairSpec?
        /// The encrypted copy of the private key. When you use the HTTP API or the AWS CLI, the value is Base64-encoded. Otherwise, it is not Base64-encoded.
        public let privateKeyCiphertextBlob: Data?
        /// The public key (in plaintext).
        public let publicKey: Data?

        public init(keyId: String? = nil, keyPairSpec: DataKeyPairSpec? = nil, privateKeyCiphertextBlob: Data? = nil, publicKey: Data? = nil) {
            self.keyId = keyId
            self.keyPairSpec = keyPairSpec
            self.privateKeyCiphertextBlob = privateKeyCiphertextBlob
            self.publicKey = publicKey
        }

        private enum CodingKeys: String, CodingKey {
            case keyId = "KeyId"
            case keyPairSpec = "KeyPairSpec"
            case privateKeyCiphertextBlob = "PrivateKeyCiphertextBlob"
            case publicKey = "PublicKey"
        }
    }

    public struct GenerateDataKeyRequest: AWSEncodableShape {
        /// Specifies the encryption context that will be used when encrypting the data key. An encryption context is a collection of non-secret key-value pairs that represents additional authenticated data. When you use an encryption context to encrypt data, you must specify the same (an exact case-sensitive match) encryption context to decrypt the data. An encryption context is optional when encrypting with a symmetric CMK, but it is highly recommended. For more information, see Encryption Context in the AWS Key Management Service Developer Guide.
        public let encryptionContext: [String: String]?
        /// A list of grant tokens. For more information, see Grant Tokens in the AWS Key Management Service Developer Guide.
        public let grantTokens: [String]?
        /// Identifies the symmetric CMK that encrypts the data key. To specify a CMK, use its key ID, Amazon Resource Name (ARN), alias name, or alias ARN. When using an alias name, prefix it with "alias/". To specify a CMK in a different AWS account, you must use the key ARN or alias ARN. For example:   Key ID: 1234abcd-12ab-34cd-56ef-1234567890ab    Key ARN: arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab    Alias name: alias/ExampleAlias    Alias ARN: arn:aws:kms:us-east-2:111122223333:alias/ExampleAlias    To get the key ID and key ARN for a CMK, use ListKeys or DescribeKey. To get the alias name and alias ARN, use ListAliases.
        public let keyId: String
        /// Specifies the length of the data key. Use AES_128 to generate a 128-bit symmetric key, or AES_256 to generate a 256-bit symmetric key. You must specify either the KeySpec or the NumberOfBytes parameter (but not both) in every GenerateDataKey request.
        public let keySpec: DataKeySpec?
        /// Specifies the length of the data key in bytes. For example, use the value 64 to generate a 512-bit data key (64 bytes is 512 bits). For 128-bit (16-byte) and 256-bit (32-byte) data keys, use the KeySpec parameter. You must specify either the KeySpec or the NumberOfBytes parameter (but not both) in every GenerateDataKey request.
        public let numberOfBytes: Int?

        public init(encryptionContext: [String: String]? = nil, grantTokens: [String]? = nil, keyId: String, keySpec: DataKeySpec? = nil, numberOfBytes: Int? = nil) {
            self.encryptionContext = encryptionContext
            self.grantTokens = grantTokens
            self.keyId = keyId
            self.keySpec = keySpec
            self.numberOfBytes = numberOfBytes
        }

        public func validate(name: String) throws {
            try self.grantTokens?.forEach {
                try validate($0, name: "grantTokens[]", parent: name, max: 8192)
                try validate($0, name: "grantTokens[]", parent: name, min: 1)
            }
            try self.validate(self.grantTokens, name: "grantTokens", parent: name, max: 10)
            try self.validate(self.grantTokens, name: "grantTokens", parent: name, min: 0)
            try self.validate(self.keyId, name: "keyId", parent: name, max: 2048)
            try self.validate(self.keyId, name: "keyId", parent: name, min: 1)
            try self.validate(self.numberOfBytes, name: "numberOfBytes", parent: name, max: 1024)
            try self.validate(self.numberOfBytes, name: "numberOfBytes", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case encryptionContext = "EncryptionContext"
            case grantTokens = "GrantTokens"
            case keyId = "KeyId"
            case keySpec = "KeySpec"
            case numberOfBytes = "NumberOfBytes"
        }
    }

    public struct GenerateDataKeyResponse: AWSDecodableShape {
        /// The encrypted copy of the data key. When you use the HTTP API or the AWS CLI, the value is Base64-encoded. Otherwise, it is not Base64-encoded.
        public let ciphertextBlob: Data?
        /// The Amazon Resource Name (key ARN) of the CMK that encrypted the data key.
        public let keyId: String?
        /// The plaintext data key. When you use the HTTP API or the AWS CLI, the value is Base64-encoded. Otherwise, it is not Base64-encoded. Use this data key to encrypt your data outside of KMS. Then, remove it from memory as soon as possible.
        public let plaintext: Data?

        public init(ciphertextBlob: Data? = nil, keyId: String? = nil, plaintext: Data? = nil) {
            self.ciphertextBlob = ciphertextBlob
            self.keyId = keyId
            self.plaintext = plaintext
        }

        private enum CodingKeys: String, CodingKey {
            case ciphertextBlob = "CiphertextBlob"
            case keyId = "KeyId"
            case plaintext = "Plaintext"
        }
    }

    public struct GenerateDataKeyWithoutPlaintextRequest: AWSEncodableShape {
        /// Specifies the encryption context that will be used when encrypting the data key. An encryption context is a collection of non-secret key-value pairs that represents additional authenticated data. When you use an encryption context to encrypt data, you must specify the same (an exact case-sensitive match) encryption context to decrypt the data. An encryption context is optional when encrypting with a symmetric CMK, but it is highly recommended. For more information, see Encryption Context in the AWS Key Management Service Developer Guide.
        public let encryptionContext: [String: String]?
        /// A list of grant tokens. For more information, see Grant Tokens in the AWS Key Management Service Developer Guide.
        public let grantTokens: [String]?
        /// The identifier of the symmetric customer master key (CMK) that encrypts the data key. To specify a CMK, use its key ID, Amazon Resource Name (ARN), alias name, or alias ARN. When using an alias name, prefix it with "alias/". To specify a CMK in a different AWS account, you must use the key ARN or alias ARN. For example:   Key ID: 1234abcd-12ab-34cd-56ef-1234567890ab    Key ARN: arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab    Alias name: alias/ExampleAlias    Alias ARN: arn:aws:kms:us-east-2:111122223333:alias/ExampleAlias    To get the key ID and key ARN for a CMK, use ListKeys or DescribeKey. To get the alias name and alias ARN, use ListAliases.
        public let keyId: String
        /// The length of the data key. Use AES_128 to generate a 128-bit symmetric key, or AES_256 to generate a 256-bit symmetric key.
        public let keySpec: DataKeySpec?
        /// The length of the data key in bytes. For example, use the value 64 to generate a 512-bit data key (64 bytes is 512 bits). For common key lengths (128-bit and 256-bit symmetric keys), we recommend that you use the KeySpec field instead of this one.
        public let numberOfBytes: Int?

        public init(encryptionContext: [String: String]? = nil, grantTokens: [String]? = nil, keyId: String, keySpec: DataKeySpec? = nil, numberOfBytes: Int? = nil) {
            self.encryptionContext = encryptionContext
            self.grantTokens = grantTokens
            self.keyId = keyId
            self.keySpec = keySpec
            self.numberOfBytes = numberOfBytes
        }

        public func validate(name: String) throws {
            try self.grantTokens?.forEach {
                try validate($0, name: "grantTokens[]", parent: name, max: 8192)
                try validate($0, name: "grantTokens[]", parent: name, min: 1)
            }
            try self.validate(self.grantTokens, name: "grantTokens", parent: name, max: 10)
            try self.validate(self.grantTokens, name: "grantTokens", parent: name, min: 0)
            try self.validate(self.keyId, name: "keyId", parent: name, max: 2048)
            try self.validate(self.keyId, name: "keyId", parent: name, min: 1)
            try self.validate(self.numberOfBytes, name: "numberOfBytes", parent: name, max: 1024)
            try self.validate(self.numberOfBytes, name: "numberOfBytes", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case encryptionContext = "EncryptionContext"
            case grantTokens = "GrantTokens"
            case keyId = "KeyId"
            case keySpec = "KeySpec"
            case numberOfBytes = "NumberOfBytes"
        }
    }

    public struct GenerateDataKeyWithoutPlaintextResponse: AWSDecodableShape {
        /// The encrypted data key. When you use the HTTP API or the AWS CLI, the value is Base64-encoded. Otherwise, it is not Base64-encoded.
        public let ciphertextBlob: Data?
        /// The Amazon Resource Name (key ARN) of the CMK that encrypted the data key.
        public let keyId: String?

        public init(ciphertextBlob: Data? = nil, keyId: String? = nil) {
            self.ciphertextBlob = ciphertextBlob
            self.keyId = keyId
        }

        private enum CodingKeys: String, CodingKey {
            case ciphertextBlob = "CiphertextBlob"
            case keyId = "KeyId"
        }
    }

    public struct GenerateRandomRequest: AWSEncodableShape {
        /// Generates the random byte string in the AWS CloudHSM cluster that is associated with the specified custom key store. To find the ID of a custom key store, use the DescribeCustomKeyStores operation.
        public let customKeyStoreId: String?
        /// The length of the byte string.
        public let numberOfBytes: Int?

        public init(customKeyStoreId: String? = nil, numberOfBytes: Int? = nil) {
            self.customKeyStoreId = customKeyStoreId
            self.numberOfBytes = numberOfBytes
        }

        public func validate(name: String) throws {
            try self.validate(self.customKeyStoreId, name: "customKeyStoreId", parent: name, max: 64)
            try self.validate(self.customKeyStoreId, name: "customKeyStoreId", parent: name, min: 1)
            try self.validate(self.numberOfBytes, name: "numberOfBytes", parent: name, max: 1024)
            try self.validate(self.numberOfBytes, name: "numberOfBytes", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case customKeyStoreId = "CustomKeyStoreId"
            case numberOfBytes = "NumberOfBytes"
        }
    }

    public struct GenerateRandomResponse: AWSDecodableShape {
        /// The random byte string. When you use the HTTP API or the AWS CLI, the value is Base64-encoded. Otherwise, it is not Base64-encoded.
        public let plaintext: Data?

        public init(plaintext: Data? = nil) {
            self.plaintext = plaintext
        }

        private enum CodingKeys: String, CodingKey {
            case plaintext = "Plaintext"
        }
    }

    public struct GetKeyPolicyRequest: AWSEncodableShape {
        /// A unique identifier for the customer master key (CMK). Specify the key ID or the Amazon Resource Name (ARN) of the CMK. For example:   Key ID: 1234abcd-12ab-34cd-56ef-1234567890ab    Key ARN: arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab    To get the key ID and key ARN for a CMK, use ListKeys or DescribeKey.
        public let keyId: String
        /// Specifies the name of the key policy. The only valid name is default. To get the names of key policies, use ListKeyPolicies.
        public let policyName: String

        public init(keyId: String, policyName: String) {
            self.keyId = keyId
            self.policyName = policyName
        }

        public func validate(name: String) throws {
            try self.validate(self.keyId, name: "keyId", parent: name, max: 2048)
            try self.validate(self.keyId, name: "keyId", parent: name, min: 1)
            try self.validate(self.policyName, name: "policyName", parent: name, max: 128)
            try self.validate(self.policyName, name: "policyName", parent: name, min: 1)
            try self.validate(self.policyName, name: "policyName", parent: name, pattern: "[\\w]+")
        }

        private enum CodingKeys: String, CodingKey {
            case keyId = "KeyId"
            case policyName = "PolicyName"
        }
    }

    public struct GetKeyPolicyResponse: AWSDecodableShape {
        /// A key policy document in JSON format.
        public let policy: String?

        public init(policy: String? = nil) {
            self.policy = policy
        }

        private enum CodingKeys: String, CodingKey {
            case policy = "Policy"
        }
    }

    public struct GetKeyRotationStatusRequest: AWSEncodableShape {
        /// A unique identifier for the customer master key (CMK). Specify the key ID or the Amazon Resource Name (ARN) of the CMK. To specify a CMK in a different AWS account, you must use the key ARN. For example:   Key ID: 1234abcd-12ab-34cd-56ef-1234567890ab    Key ARN: arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab    To get the key ID and key ARN for a CMK, use ListKeys or DescribeKey.
        public let keyId: String

        public init(keyId: String) {
            self.keyId = keyId
        }

        public func validate(name: String) throws {
            try self.validate(self.keyId, name: "keyId", parent: name, max: 2048)
            try self.validate(self.keyId, name: "keyId", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case keyId = "KeyId"
        }
    }

    public struct GetKeyRotationStatusResponse: AWSDecodableShape {
        /// A Boolean value that specifies whether key rotation is enabled.
        public let keyRotationEnabled: Bool?

        public init(keyRotationEnabled: Bool? = nil) {
            self.keyRotationEnabled = keyRotationEnabled
        }

        private enum CodingKeys: String, CodingKey {
            case keyRotationEnabled = "KeyRotationEnabled"
        }
    }

    public struct GetParametersForImportRequest: AWSEncodableShape {
        /// The identifier of the symmetric CMK into which you will import key material. The Origin of the CMK must be EXTERNAL. Specify the key ID or the Amazon Resource Name (ARN) of the CMK. For example:   Key ID: 1234abcd-12ab-34cd-56ef-1234567890ab    Key ARN: arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab    To get the key ID and key ARN for a CMK, use ListKeys or DescribeKey.
        public let keyId: String
        /// The algorithm you will use to encrypt the key material before importing it with ImportKeyMaterial. For more information, see Encrypt the Key Material in the AWS Key Management Service Developer Guide.
        public let wrappingAlgorithm: AlgorithmSpec
        /// The type of wrapping key (public key) to return in the response. Only 2048-bit RSA public keys are supported.
        public let wrappingKeySpec: WrappingKeySpec

        public init(keyId: String, wrappingAlgorithm: AlgorithmSpec, wrappingKeySpec: WrappingKeySpec) {
            self.keyId = keyId
            self.wrappingAlgorithm = wrappingAlgorithm
            self.wrappingKeySpec = wrappingKeySpec
        }

        public func validate(name: String) throws {
            try self.validate(self.keyId, name: "keyId", parent: name, max: 2048)
            try self.validate(self.keyId, name: "keyId", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case keyId = "KeyId"
            case wrappingAlgorithm = "WrappingAlgorithm"
            case wrappingKeySpec = "WrappingKeySpec"
        }
    }

    public struct GetParametersForImportResponse: AWSDecodableShape {
        /// The import token to send in a subsequent ImportKeyMaterial request.
        public let importToken: Data?
        /// The Amazon Resource Name (key ARN) of the CMK to use in a subsequent ImportKeyMaterial request. This is the same CMK specified in the GetParametersForImport request.
        public let keyId: String?
        /// The time at which the import token and public key are no longer valid. After this time, you cannot use them to make an ImportKeyMaterial request and you must send another GetParametersForImport request to get new ones.
        public let parametersValidTo: Date?
        /// The public key to use to encrypt the key material before importing it with ImportKeyMaterial.
        public let publicKey: Data?

        public init(importToken: Data? = nil, keyId: String? = nil, parametersValidTo: Date? = nil, publicKey: Data? = nil) {
            self.importToken = importToken
            self.keyId = keyId
            self.parametersValidTo = parametersValidTo
            self.publicKey = publicKey
        }

        private enum CodingKeys: String, CodingKey {
            case importToken = "ImportToken"
            case keyId = "KeyId"
            case parametersValidTo = "ParametersValidTo"
            case publicKey = "PublicKey"
        }
    }

    public struct GetPublicKeyRequest: AWSEncodableShape {
        /// A list of grant tokens. For more information, see Grant Tokens in the AWS Key Management Service Developer Guide.
        public let grantTokens: [String]?
        /// Identifies the asymmetric CMK that includes the public key. To specify a CMK, use its key ID, Amazon Resource Name (ARN), alias name, or alias ARN. When using an alias name, prefix it with "alias/". To specify a CMK in a different AWS account, you must use the key ARN or alias ARN. For example:   Key ID: 1234abcd-12ab-34cd-56ef-1234567890ab    Key ARN: arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab    Alias name: alias/ExampleAlias    Alias ARN: arn:aws:kms:us-east-2:111122223333:alias/ExampleAlias    To get the key ID and key ARN for a CMK, use ListKeys or DescribeKey. To get the alias name and alias ARN, use ListAliases.
        public let keyId: String

        public init(grantTokens: [String]? = nil, keyId: String) {
            self.grantTokens = grantTokens
            self.keyId = keyId
        }

        public func validate(name: String) throws {
            try self.grantTokens?.forEach {
                try validate($0, name: "grantTokens[]", parent: name, max: 8192)
                try validate($0, name: "grantTokens[]", parent: name, min: 1)
            }
            try self.validate(self.grantTokens, name: "grantTokens", parent: name, max: 10)
            try self.validate(self.grantTokens, name: "grantTokens", parent: name, min: 0)
            try self.validate(self.keyId, name: "keyId", parent: name, max: 2048)
            try self.validate(self.keyId, name: "keyId", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case grantTokens = "GrantTokens"
            case keyId = "KeyId"
        }
    }

    public struct GetPublicKeyResponse: AWSDecodableShape {
        /// The type of the of the public key that was downloaded.
        public let customerMasterKeySpec: CustomerMasterKeySpec?
        /// The encryption algorithms that AWS KMS supports for this key.  This information is critical. If a public key encrypts data outside of AWS KMS by using an unsupported encryption algorithm, the ciphertext cannot be decrypted.  This field appears in the response only when the KeyUsage of the public key is ENCRYPT_DECRYPT.
        public let encryptionAlgorithms: [EncryptionAlgorithmSpec]?
        /// The Amazon Resource Name (key ARN) of the asymmetric CMK from which the public key was downloaded.
        public let keyId: String?
        /// The permitted use of the public key. Valid values are ENCRYPT_DECRYPT or SIGN_VERIFY.  This information is critical. If a public key with SIGN_VERIFY key usage encrypts data outside of AWS KMS, the ciphertext cannot be decrypted.
        public let keyUsage: KeyUsageType?
        /// The exported public key.  The value is a DER-encoded X.509 public key, also known as SubjectPublicKeyInfo (SPKI), as defined in RFC 5280. When you use the HTTP API or the AWS CLI, the value is Base64-encoded. Otherwise, it is not Base64-encoded.
        public let publicKey: Data?
        /// The signing algorithms that AWS KMS supports for this key. This field appears in the response only when the KeyUsage of the public key is SIGN_VERIFY.
        public let signingAlgorithms: [SigningAlgorithmSpec]?

        public init(customerMasterKeySpec: CustomerMasterKeySpec? = nil, encryptionAlgorithms: [EncryptionAlgorithmSpec]? = nil, keyId: String? = nil, keyUsage: KeyUsageType? = nil, publicKey: Data? = nil, signingAlgorithms: [SigningAlgorithmSpec]? = nil) {
            self.customerMasterKeySpec = customerMasterKeySpec
            self.encryptionAlgorithms = encryptionAlgorithms
            self.keyId = keyId
            self.keyUsage = keyUsage
            self.publicKey = publicKey
            self.signingAlgorithms = signingAlgorithms
        }

        private enum CodingKeys: String, CodingKey {
            case customerMasterKeySpec = "CustomerMasterKeySpec"
            case encryptionAlgorithms = "EncryptionAlgorithms"
            case keyId = "KeyId"
            case keyUsage = "KeyUsage"
            case publicKey = "PublicKey"
            case signingAlgorithms = "SigningAlgorithms"
        }
    }

    public struct GrantConstraints: AWSEncodableShape & AWSDecodableShape {
        /// A list of key-value pairs that must match the encryption context in the cryptographic operation request. The grant allows the operation only when the encryption context in the request is the same as the encryption context specified in this constraint.
        public let encryptionContextEquals: [String: String]?
        /// A list of key-value pairs that must be included in the encryption context of the cryptographic operation request. The grant allows the cryptographic operation only when the encryption context in the request includes the key-value pairs specified in this constraint, although it can include additional key-value pairs.
        public let encryptionContextSubset: [String: String]?

        public init(encryptionContextEquals: [String: String]? = nil, encryptionContextSubset: [String: String]? = nil) {
            self.encryptionContextEquals = encryptionContextEquals
            self.encryptionContextSubset = encryptionContextSubset
        }

        private enum CodingKeys: String, CodingKey {
            case encryptionContextEquals = "EncryptionContextEquals"
            case encryptionContextSubset = "EncryptionContextSubset"
        }
    }

    public struct GrantListEntry: AWSDecodableShape {
        /// A list of key-value pairs that must be present in the encryption context of certain subsequent operations that the grant allows.
        public let constraints: GrantConstraints?
        /// The date and time when the grant was created.
        public let creationDate: Date?
        /// The identity that gets the permissions in the grant. The GranteePrincipal field in the ListGrants response usually contains the user or role designated as the grantee principal in the grant. However, when the grantee principal in the grant is an AWS service, the GranteePrincipal field contains the service principal, which might represent several different grantee principals.
        public let granteePrincipal: String?
        /// The unique identifier for the grant.
        public let grantId: String?
        /// The AWS account under which the grant was issued.
        public let issuingAccount: String?
        /// The unique identifier for the customer master key (CMK) to which the grant applies.
        public let keyId: String?
        /// The friendly name that identifies the grant. If a name was provided in the CreateGrant request, that name is returned. Otherwise this value is null.
        public let name: String?
        /// The list of operations permitted by the grant.
        public let operations: [GrantOperation]?
        /// The principal that can retire the grant.
        public let retiringPrincipal: String?

        public init(constraints: GrantConstraints? = nil, creationDate: Date? = nil, granteePrincipal: String? = nil, grantId: String? = nil, issuingAccount: String? = nil, keyId: String? = nil, name: String? = nil, operations: [GrantOperation]? = nil, retiringPrincipal: String? = nil) {
            self.constraints = constraints
            self.creationDate = creationDate
            self.granteePrincipal = granteePrincipal
            self.grantId = grantId
            self.issuingAccount = issuingAccount
            self.keyId = keyId
            self.name = name
            self.operations = operations
            self.retiringPrincipal = retiringPrincipal
        }

        private enum CodingKeys: String, CodingKey {
            case constraints = "Constraints"
            case creationDate = "CreationDate"
            case granteePrincipal = "GranteePrincipal"
            case grantId = "GrantId"
            case issuingAccount = "IssuingAccount"
            case keyId = "KeyId"
            case name = "Name"
            case operations = "Operations"
            case retiringPrincipal = "RetiringPrincipal"
        }
    }

    public struct ImportKeyMaterialRequest: AWSEncodableShape {
        /// The encrypted key material to import. The key material must be encrypted with the public wrapping key that GetParametersForImport returned, using the wrapping algorithm that you specified in the same GetParametersForImport request.
        public let encryptedKeyMaterial: Data
        /// Specifies whether the key material expires. The default is KEY_MATERIAL_EXPIRES, in which case you must include the ValidTo parameter. When this parameter is set to KEY_MATERIAL_DOES_NOT_EXPIRE, you must omit the ValidTo parameter.
        public let expirationModel: ExpirationModelType?
        /// The import token that you received in the response to a previous GetParametersForImport request. It must be from the same response that contained the public key that you used to encrypt the key material.
        public let importToken: Data
        /// The identifier of the symmetric CMK that receives the imported key material. The CMK's Origin must be EXTERNAL. This must be the same CMK specified in the KeyID parameter of the corresponding GetParametersForImport request. Specify the key ID or the Amazon Resource Name (ARN) of the CMK. For example:   Key ID: 1234abcd-12ab-34cd-56ef-1234567890ab    Key ARN: arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab    To get the key ID and key ARN for a CMK, use ListKeys or DescribeKey.
        public let keyId: String
        /// The time at which the imported key material expires. When the key material expires, AWS KMS deletes the key material and the CMK becomes unusable. You must omit this parameter when the ExpirationModel parameter is set to KEY_MATERIAL_DOES_NOT_EXPIRE. Otherwise it is required.
        public let validTo: Date?

        public init(encryptedKeyMaterial: Data, expirationModel: ExpirationModelType? = nil, importToken: Data, keyId: String, validTo: Date? = nil) {
            self.encryptedKeyMaterial = encryptedKeyMaterial
            self.expirationModel = expirationModel
            self.importToken = importToken
            self.keyId = keyId
            self.validTo = validTo
        }

        public func validate(name: String) throws {
            try self.validate(self.encryptedKeyMaterial, name: "encryptedKeyMaterial", parent: name, max: 6144)
            try self.validate(self.encryptedKeyMaterial, name: "encryptedKeyMaterial", parent: name, min: 1)
            try self.validate(self.importToken, name: "importToken", parent: name, max: 6144)
            try self.validate(self.importToken, name: "importToken", parent: name, min: 1)
            try self.validate(self.keyId, name: "keyId", parent: name, max: 2048)
            try self.validate(self.keyId, name: "keyId", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case encryptedKeyMaterial = "EncryptedKeyMaterial"
            case expirationModel = "ExpirationModel"
            case importToken = "ImportToken"
            case keyId = "KeyId"
            case validTo = "ValidTo"
        }
    }

    public struct ImportKeyMaterialResponse: AWSDecodableShape {
        public init() {}
    }

    public struct KeyListEntry: AWSDecodableShape {
        /// ARN of the key.
        public let keyArn: String?
        /// Unique identifier of the key.
        public let keyId: String?

        public init(keyArn: String? = nil, keyId: String? = nil) {
            self.keyArn = keyArn
            self.keyId = keyId
        }

        private enum CodingKeys: String, CodingKey {
            case keyArn = "KeyArn"
            case keyId = "KeyId"
        }
    }

    public struct KeyMetadata: AWSDecodableShape {
        /// The Amazon Resource Name (ARN) of the CMK. For examples, see AWS Key Management Service (AWS KMS) in the Example ARNs section of the AWS General Reference.
        public let arn: String?
        /// The twelve-digit account ID of the AWS account that owns the CMK.
        public let aWSAccountId: String?
        /// The cluster ID of the AWS CloudHSM cluster that contains the key material for the CMK. When you create a CMK in a custom key store, AWS KMS creates the key material for the CMK in the associated AWS CloudHSM cluster. This value is present only when the CMK is created in a custom key store.
        public let cloudHsmClusterId: String?
        /// The date and time when the CMK was created.
        public let creationDate: Date?
        /// Describes the type of key material in the CMK.
        public let customerMasterKeySpec: CustomerMasterKeySpec?
        /// A unique identifier for the custom key store that contains the CMK. This value is present only when the CMK is created in a custom key store.
        public let customKeyStoreId: String?
        /// The date and time after which AWS KMS deletes the CMK. This value is present only when KeyState is PendingDeletion.
        public let deletionDate: Date?
        /// The description of the CMK.
        public let description: String?
        /// Specifies whether the CMK is enabled. When KeyState is Enabled this value is true, otherwise it is false.
        public let enabled: Bool?
        /// The encryption algorithms that the CMK supports. You cannot use the CMK with other encryption algorithms within AWS KMS. This field appears only when the KeyUsage of the CMK is ENCRYPT_DECRYPT.
        public let encryptionAlgorithms: [EncryptionAlgorithmSpec]?
        /// Specifies whether the CMK's key material expires. This value is present only when Origin is EXTERNAL, otherwise this value is omitted.
        public let expirationModel: ExpirationModelType?
        /// The globally unique identifier for the CMK.
        public let keyId: String
        /// The manager of the CMK. CMKs in your AWS account are either customer managed or AWS managed. For more information about the difference, see Customer Master Keys in the AWS Key Management Service Developer Guide.
        public let keyManager: KeyManagerType?
        /// The current status of the CMK. For more information about how key state affects the use of a CMK, see Key state: Effect on your CMK in the AWS Key Management Service Developer Guide.
        public let keyState: KeyState?
        /// The cryptographic operations for which you can use the CMK.
        public let keyUsage: KeyUsageType?
        /// The source of the CMK's key material. When this value is AWS_KMS, AWS KMS created the key material. When this value is EXTERNAL, the key material was imported from your existing key management infrastructure or the CMK lacks key material. When this value is AWS_CLOUDHSM, the key material was created in the AWS CloudHSM cluster associated with a custom key store.
        public let origin: OriginType?
        /// The signing algorithms that the CMK supports. You cannot use the CMK with other signing algorithms within AWS KMS. This field appears only when the KeyUsage of the CMK is SIGN_VERIFY.
        public let signingAlgorithms: [SigningAlgorithmSpec]?
        /// The time at which the imported key material expires. When the key material expires, AWS KMS deletes the key material and the CMK becomes unusable. This value is present only for CMKs whose Origin is EXTERNAL and whose ExpirationModel is KEY_MATERIAL_EXPIRES, otherwise this value is omitted.
        public let validTo: Date?

        public init(arn: String? = nil, aWSAccountId: String? = nil, cloudHsmClusterId: String? = nil, creationDate: Date? = nil, customerMasterKeySpec: CustomerMasterKeySpec? = nil, customKeyStoreId: String? = nil, deletionDate: Date? = nil, description: String? = nil, enabled: Bool? = nil, encryptionAlgorithms: [EncryptionAlgorithmSpec]? = nil, expirationModel: ExpirationModelType? = nil, keyId: String, keyManager: KeyManagerType? = nil, keyState: KeyState? = nil, keyUsage: KeyUsageType? = nil, origin: OriginType? = nil, signingAlgorithms: [SigningAlgorithmSpec]? = nil, validTo: Date? = nil) {
            self.arn = arn
            self.aWSAccountId = aWSAccountId
            self.cloudHsmClusterId = cloudHsmClusterId
            self.creationDate = creationDate
            self.customerMasterKeySpec = customerMasterKeySpec
            self.customKeyStoreId = customKeyStoreId
            self.deletionDate = deletionDate
            self.description = description
            self.enabled = enabled
            self.encryptionAlgorithms = encryptionAlgorithms
            self.expirationModel = expirationModel
            self.keyId = keyId
            self.keyManager = keyManager
            self.keyState = keyState
            self.keyUsage = keyUsage
            self.origin = origin
            self.signingAlgorithms = signingAlgorithms
            self.validTo = validTo
        }

        private enum CodingKeys: String, CodingKey {
            case arn = "Arn"
            case aWSAccountId = "AWSAccountId"
            case cloudHsmClusterId = "CloudHsmClusterId"
            case creationDate = "CreationDate"
            case customerMasterKeySpec = "CustomerMasterKeySpec"
            case customKeyStoreId = "CustomKeyStoreId"
            case deletionDate = "DeletionDate"
            case description = "Description"
            case enabled = "Enabled"
            case encryptionAlgorithms = "EncryptionAlgorithms"
            case expirationModel = "ExpirationModel"
            case keyId = "KeyId"
            case keyManager = "KeyManager"
            case keyState = "KeyState"
            case keyUsage = "KeyUsage"
            case origin = "Origin"
            case signingAlgorithms = "SigningAlgorithms"
            case validTo = "ValidTo"
        }
    }

    public struct ListAliasesRequest: AWSEncodableShape {
        /// Lists only aliases that are associated with the specified CMK. Enter a CMK in your AWS account.  This parameter is optional. If you omit it, ListAliases returns all aliases in the account and Region. Specify the key ID or the Amazon Resource Name (ARN) of the CMK. For example:   Key ID: 1234abcd-12ab-34cd-56ef-1234567890ab    Key ARN: arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab    To get the key ID and key ARN for a CMK, use ListKeys or DescribeKey.
        public let keyId: String?
        /// Use this parameter to specify the maximum number of items to return. When this value is present, AWS KMS does not return more than the specified number of items, but it might return fewer. This value is optional. If you include a value, it must be between 1 and 100, inclusive. If you do not include a value, it defaults to 50.
        public let limit: Int?
        /// Use this parameter in a subsequent request after you receive a response with truncated results. Set it to the value of NextMarker from the truncated response you just received.
        public let marker: String?

        public init(keyId: String? = nil, limit: Int? = nil, marker: String? = nil) {
            self.keyId = keyId
            self.limit = limit
            self.marker = marker
        }

        public func validate(name: String) throws {
            try self.validate(self.keyId, name: "keyId", parent: name, max: 2048)
            try self.validate(self.keyId, name: "keyId", parent: name, min: 1)
            try self.validate(self.limit, name: "limit", parent: name, max: 1000)
            try self.validate(self.limit, name: "limit", parent: name, min: 1)
            try self.validate(self.marker, name: "marker", parent: name, max: 1024)
            try self.validate(self.marker, name: "marker", parent: name, min: 1)
            try self.validate(self.marker, name: "marker", parent: name, pattern: "[\\u0020-\\u00FF]*")
        }

        private enum CodingKeys: String, CodingKey {
            case keyId = "KeyId"
            case limit = "Limit"
            case marker = "Marker"
        }
    }

    public struct ListAliasesResponse: AWSDecodableShape {
        /// A list of aliases.
        public let aliases: [AliasListEntry]?
        /// When Truncated is true, this element is present and contains the value to use for the Marker parameter in a subsequent request.
        public let nextMarker: String?
        /// A flag that indicates whether there are more items in the list. When this value is true, the list in this response is truncated. To get more items, pass the value of the NextMarker element in thisresponse to the Marker parameter in a subsequent request.
        public let truncated: Bool?

        public init(aliases: [AliasListEntry]? = nil, nextMarker: String? = nil, truncated: Bool? = nil) {
            self.aliases = aliases
            self.nextMarker = nextMarker
            self.truncated = truncated
        }

        private enum CodingKeys: String, CodingKey {
            case aliases = "Aliases"
            case nextMarker = "NextMarker"
            case truncated = "Truncated"
        }
    }

    public struct ListGrantsRequest: AWSEncodableShape {
        /// Returns only grants where the specified principal is the grantee principal for the grant.
        public let granteePrincipal: String?
        /// Returns only the grant with the specified grant ID. The grant ID uniquely identifies the grant.
        public let grantId: String?
        /// Returns only grants for the specified customer master key (CMK). This parameter is required. Specify the key ID or the Amazon Resource Name (ARN) of the CMK. To specify a CMK in a different AWS account, you must use the key ARN. For example:   Key ID: 1234abcd-12ab-34cd-56ef-1234567890ab    Key ARN: arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab    To get the key ID and key ARN for a CMK, use ListKeys or DescribeKey.
        public let keyId: String
        /// Use this parameter to specify the maximum number of items to return. When this value is present, AWS KMS does not return more than the specified number of items, but it might return fewer. This value is optional. If you include a value, it must be between 1 and 100, inclusive. If you do not include a value, it defaults to 50.
        public let limit: Int?
        /// Use this parameter in a subsequent request after you receive a response with truncated results. Set it to the value of NextMarker from the truncated response you just received.
        public let marker: String?

        public init(granteePrincipal: String? = nil, grantId: String? = nil, keyId: String, limit: Int? = nil, marker: String? = nil) {
            self.granteePrincipal = granteePrincipal
            self.grantId = grantId
            self.keyId = keyId
            self.limit = limit
            self.marker = marker
        }

        public func validate(name: String) throws {
            try self.validate(self.granteePrincipal, name: "granteePrincipal", parent: name, max: 256)
            try self.validate(self.granteePrincipal, name: "granteePrincipal", parent: name, min: 1)
            try self.validate(self.granteePrincipal, name: "granteePrincipal", parent: name, pattern: "^[\\w+=,.@:/-]+$")
            try self.validate(self.grantId, name: "grantId", parent: name, max: 128)
            try self.validate(self.grantId, name: "grantId", parent: name, min: 1)
            try self.validate(self.keyId, name: "keyId", parent: name, max: 2048)
            try self.validate(self.keyId, name: "keyId", parent: name, min: 1)
            try self.validate(self.limit, name: "limit", parent: name, max: 1000)
            try self.validate(self.limit, name: "limit", parent: name, min: 1)
            try self.validate(self.marker, name: "marker", parent: name, max: 1024)
            try self.validate(self.marker, name: "marker", parent: name, min: 1)
            try self.validate(self.marker, name: "marker", parent: name, pattern: "[\\u0020-\\u00FF]*")
        }

        private enum CodingKeys: String, CodingKey {
            case granteePrincipal = "GranteePrincipal"
            case grantId = "GrantId"
            case keyId = "KeyId"
            case limit = "Limit"
            case marker = "Marker"
        }
    }

    public struct ListGrantsResponse: AWSDecodableShape {
        /// A list of grants.
        public let grants: [GrantListEntry]?
        /// When Truncated is true, this element is present and contains the value to use for the Marker parameter in a subsequent request.
        public let nextMarker: String?
        /// A flag that indicates whether there are more items in the list. When this value is true, the list in this response is truncated. To get more items, pass the value of the NextMarker element in thisresponse to the Marker parameter in a subsequent request.
        public let truncated: Bool?

        public init(grants: [GrantListEntry]? = nil, nextMarker: String? = nil, truncated: Bool? = nil) {
            self.grants = grants
            self.nextMarker = nextMarker
            self.truncated = truncated
        }

        private enum CodingKeys: String, CodingKey {
            case grants = "Grants"
            case nextMarker = "NextMarker"
            case truncated = "Truncated"
        }
    }

    public struct ListKeyPoliciesRequest: AWSEncodableShape {
        /// A unique identifier for the customer master key (CMK). Specify the key ID or the Amazon Resource Name (ARN) of the CMK. For example:   Key ID: 1234abcd-12ab-34cd-56ef-1234567890ab    Key ARN: arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab    To get the key ID and key ARN for a CMK, use ListKeys or DescribeKey.
        public let keyId: String
        /// Use this parameter to specify the maximum number of items to return. When this value is present, AWS KMS does not return more than the specified number of items, but it might return fewer. This value is optional. If you include a value, it must be between 1 and 1000, inclusive. If you do not include a value, it defaults to 100. Only one policy can be attached to a key.
        public let limit: Int?
        /// Use this parameter in a subsequent request after you receive a response with truncated results. Set it to the value of NextMarker from the truncated response you just received.
        public let marker: String?

        public init(keyId: String, limit: Int? = nil, marker: String? = nil) {
            self.keyId = keyId
            self.limit = limit
            self.marker = marker
        }

        public func validate(name: String) throws {
            try self.validate(self.keyId, name: "keyId", parent: name, max: 2048)
            try self.validate(self.keyId, name: "keyId", parent: name, min: 1)
            try self.validate(self.limit, name: "limit", parent: name, max: 1000)
            try self.validate(self.limit, name: "limit", parent: name, min: 1)
            try self.validate(self.marker, name: "marker", parent: name, max: 1024)
            try self.validate(self.marker, name: "marker", parent: name, min: 1)
            try self.validate(self.marker, name: "marker", parent: name, pattern: "[\\u0020-\\u00FF]*")
        }

        private enum CodingKeys: String, CodingKey {
            case keyId = "KeyId"
            case limit = "Limit"
            case marker = "Marker"
        }
    }

    public struct ListKeyPoliciesResponse: AWSDecodableShape {
        /// When Truncated is true, this element is present and contains the value to use for the Marker parameter in a subsequent request.
        public let nextMarker: String?
        /// A list of key policy names. The only valid value is default.
        public let policyNames: [String]?
        /// A flag that indicates whether there are more items in the list. When this value is true, the list in this response is truncated. To get more items, pass the value of the NextMarker element in thisresponse to the Marker parameter in a subsequent request.
        public let truncated: Bool?

        public init(nextMarker: String? = nil, policyNames: [String]? = nil, truncated: Bool? = nil) {
            self.nextMarker = nextMarker
            self.policyNames = policyNames
            self.truncated = truncated
        }

        private enum CodingKeys: String, CodingKey {
            case nextMarker = "NextMarker"
            case policyNames = "PolicyNames"
            case truncated = "Truncated"
        }
    }

    public struct ListKeysRequest: AWSEncodableShape {
        /// Use this parameter to specify the maximum number of items to return. When this value is present, AWS KMS does not return more than the specified number of items, but it might return fewer. This value is optional. If you include a value, it must be between 1 and 1000, inclusive. If you do not include a value, it defaults to 100.
        public let limit: Int?
        /// Use this parameter in a subsequent request after you receive a response with truncated results. Set it to the value of NextMarker from the truncated response you just received.
        public let marker: String?

        public init(limit: Int? = nil, marker: String? = nil) {
            self.limit = limit
            self.marker = marker
        }

        public func validate(name: String) throws {
            try self.validate(self.limit, name: "limit", parent: name, max: 1000)
            try self.validate(self.limit, name: "limit", parent: name, min: 1)
            try self.validate(self.marker, name: "marker", parent: name, max: 1024)
            try self.validate(self.marker, name: "marker", parent: name, min: 1)
            try self.validate(self.marker, name: "marker", parent: name, pattern: "[\\u0020-\\u00FF]*")
        }

        private enum CodingKeys: String, CodingKey {
            case limit = "Limit"
            case marker = "Marker"
        }
    }

    public struct ListKeysResponse: AWSDecodableShape {
        /// A list of customer master keys (CMKs).
        public let keys: [KeyListEntry]?
        /// When Truncated is true, this element is present and contains the value to use for the Marker parameter in a subsequent request.
        public let nextMarker: String?
        /// A flag that indicates whether there are more items in the list. When this value is true, the list in this response is truncated. To get more items, pass the value of the NextMarker element in thisresponse to the Marker parameter in a subsequent request.
        public let truncated: Bool?

        public init(keys: [KeyListEntry]? = nil, nextMarker: String? = nil, truncated: Bool? = nil) {
            self.keys = keys
            self.nextMarker = nextMarker
            self.truncated = truncated
        }

        private enum CodingKeys: String, CodingKey {
            case keys = "Keys"
            case nextMarker = "NextMarker"
            case truncated = "Truncated"
        }
    }

    public struct ListResourceTagsRequest: AWSEncodableShape {
        /// A unique identifier for the customer master key (CMK). Specify the key ID or the Amazon Resource Name (ARN) of the CMK. For example:   Key ID: 1234abcd-12ab-34cd-56ef-1234567890ab    Key ARN: arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab    To get the key ID and key ARN for a CMK, use ListKeys or DescribeKey.
        public let keyId: String
        /// Use this parameter to specify the maximum number of items to return. When this value is present, AWS KMS does not return more than the specified number of items, but it might return fewer. This value is optional. If you include a value, it must be between 1 and 50, inclusive. If you do not include a value, it defaults to 50.
        public let limit: Int?
        /// Use this parameter in a subsequent request after you receive a response with truncated results. Set it to the value of NextMarker from the truncated response you just received. Do not attempt to construct this value. Use only the value of NextMarker from the truncated response you just received.
        public let marker: String?

        public init(keyId: String, limit: Int? = nil, marker: String? = nil) {
            self.keyId = keyId
            self.limit = limit
            self.marker = marker
        }

        public func validate(name: String) throws {
            try self.validate(self.keyId, name: "keyId", parent: name, max: 2048)
            try self.validate(self.keyId, name: "keyId", parent: name, min: 1)
            try self.validate(self.limit, name: "limit", parent: name, max: 1000)
            try self.validate(self.limit, name: "limit", parent: name, min: 1)
            try self.validate(self.marker, name: "marker", parent: name, max: 1024)
            try self.validate(self.marker, name: "marker", parent: name, min: 1)
            try self.validate(self.marker, name: "marker", parent: name, pattern: "[\\u0020-\\u00FF]*")
        }

        private enum CodingKeys: String, CodingKey {
            case keyId = "KeyId"
            case limit = "Limit"
            case marker = "Marker"
        }
    }

    public struct ListResourceTagsResponse: AWSDecodableShape {
        /// When Truncated is true, this element is present and contains the value to use for the Marker parameter in a subsequent request. Do not assume or infer any information from this value.
        public let nextMarker: String?
        /// A list of tags. Each tag consists of a tag key and a tag value.
        public let tags: [Tag]?
        /// A flag that indicates whether there are more items in the list. When this value is true, the list in this response is truncated. To get more items, pass the value of the NextMarker element in thisresponse to the Marker parameter in a subsequent request.
        public let truncated: Bool?

        public init(nextMarker: String? = nil, tags: [Tag]? = nil, truncated: Bool? = nil) {
            self.nextMarker = nextMarker
            self.tags = tags
            self.truncated = truncated
        }

        private enum CodingKeys: String, CodingKey {
            case nextMarker = "NextMarker"
            case tags = "Tags"
            case truncated = "Truncated"
        }
    }

    public struct ListRetirableGrantsRequest: AWSEncodableShape {
        /// Use this parameter to specify the maximum number of items to return. When this value is present, AWS KMS does not return more than the specified number of items, but it might return fewer. This value is optional. If you include a value, it must be between 1 and 100, inclusive. If you do not include a value, it defaults to 50.
        public let limit: Int?
        /// Use this parameter in a subsequent request after you receive a response with truncated results. Set it to the value of NextMarker from the truncated response you just received.
        public let marker: String?
        /// The retiring principal for which to list grants. Enter a principal in your AWS account. To specify the retiring principal, use the Amazon Resource Name (ARN) of an AWS principal. Valid AWS principals include AWS accounts (root), IAM users, federated users, and assumed role users. For examples of the ARN syntax for specifying a principal, see AWS Identity and Access Management (IAM) in the Example ARNs section of the Amazon Web Services General Reference.
        public let retiringPrincipal: String

        public init(limit: Int? = nil, marker: String? = nil, retiringPrincipal: String) {
            self.limit = limit
            self.marker = marker
            self.retiringPrincipal = retiringPrincipal
        }

        public func validate(name: String) throws {
            try self.validate(self.limit, name: "limit", parent: name, max: 1000)
            try self.validate(self.limit, name: "limit", parent: name, min: 1)
            try self.validate(self.marker, name: "marker", parent: name, max: 1024)
            try self.validate(self.marker, name: "marker", parent: name, min: 1)
            try self.validate(self.marker, name: "marker", parent: name, pattern: "[\\u0020-\\u00FF]*")
            try self.validate(self.retiringPrincipal, name: "retiringPrincipal", parent: name, max: 256)
            try self.validate(self.retiringPrincipal, name: "retiringPrincipal", parent: name, min: 1)
            try self.validate(self.retiringPrincipal, name: "retiringPrincipal", parent: name, pattern: "^[\\w+=,.@:/-]+$")
        }

        private enum CodingKeys: String, CodingKey {
            case limit = "Limit"
            case marker = "Marker"
            case retiringPrincipal = "RetiringPrincipal"
        }
    }

    public struct PutKeyPolicyRequest: AWSEncodableShape {
        /// A flag to indicate whether to bypass the key policy lockout safety check.  Setting this value to true increases the risk that the CMK becomes unmanageable. Do not set this value to true indiscriminately. For more information, refer to the scenario in the Default Key Policy section in the AWS Key Management Service Developer Guide.  Use this parameter only when you intend to prevent the principal that is making the request from making a subsequent PutKeyPolicy request on the CMK. The default value is false.
        public let bypassPolicyLockoutSafetyCheck: Bool?
        /// A unique identifier for the customer master key (CMK). Specify the key ID or the Amazon Resource Name (ARN) of the CMK. For example:   Key ID: 1234abcd-12ab-34cd-56ef-1234567890ab    Key ARN: arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab    To get the key ID and key ARN for a CMK, use ListKeys or DescribeKey.
        public let keyId: String
        /// The key policy to attach to the CMK. The key policy must meet the following criteria:   If you don't set BypassPolicyLockoutSafetyCheck to true, the key policy must allow the principal that is making the PutKeyPolicy request to make a subsequent PutKeyPolicy request on the CMK. This reduces the risk that the CMK becomes unmanageable. For more information, refer to the scenario in the Default Key Policy section of the AWS Key Management Service Developer Guide.   Each statement in the key policy must contain one or more principals. The principals in the key policy must exist and be visible to AWS KMS. When you create a new AWS principal (for example, an IAM user or role), you might need to enforce a delay before including the new principal in a key policy because the new principal might not be immediately visible to AWS KMS. For more information, see Changes that I make are not always immediately visible in the AWS Identity and Access Management User Guide.   The key policy cannot exceed 32 kilobytes (32768 bytes). For more information, see Resource Quotas in the AWS Key Management Service Developer Guide.
        public let policy: String
        /// The name of the key policy. The only valid value is default.
        public let policyName: String

        public init(bypassPolicyLockoutSafetyCheck: Bool? = nil, keyId: String, policy: String, policyName: String) {
            self.bypassPolicyLockoutSafetyCheck = bypassPolicyLockoutSafetyCheck
            self.keyId = keyId
            self.policy = policy
            self.policyName = policyName
        }

        public func validate(name: String) throws {
            try self.validate(self.keyId, name: "keyId", parent: name, max: 2048)
            try self.validate(self.keyId, name: "keyId", parent: name, min: 1)
            try self.validate(self.policy, name: "policy", parent: name, max: 131_072)
            try self.validate(self.policy, name: "policy", parent: name, min: 1)
            try self.validate(self.policy, name: "policy", parent: name, pattern: "[\\u0009\\u000A\\u000D\\u0020-\\u00FF]+")
            try self.validate(self.policyName, name: "policyName", parent: name, max: 128)
            try self.validate(self.policyName, name: "policyName", parent: name, min: 1)
            try self.validate(self.policyName, name: "policyName", parent: name, pattern: "[\\w]+")
        }

        private enum CodingKeys: String, CodingKey {
            case bypassPolicyLockoutSafetyCheck = "BypassPolicyLockoutSafetyCheck"
            case keyId = "KeyId"
            case policy = "Policy"
            case policyName = "PolicyName"
        }
    }

    public struct ReEncryptRequest: AWSEncodableShape {
        /// Ciphertext of the data to reencrypt.
        public let ciphertextBlob: Data
        /// Specifies the encryption algorithm that AWS KMS will use to reecrypt the data after it has decrypted it. The default value, SYMMETRIC_DEFAULT, represents the encryption algorithm used for symmetric CMKs. This parameter is required only when the destination CMK is an asymmetric CMK.
        public let destinationEncryptionAlgorithm: EncryptionAlgorithmSpec?
        /// Specifies that encryption context to use when the reencrypting the data. A destination encryption context is valid only when the destination CMK is a symmetric CMK. The standard ciphertext format for asymmetric CMKs does not include fields for metadata. An encryption context is a collection of non-secret key-value pairs that represents additional authenticated data. When you use an encryption context to encrypt data, you must specify the same (an exact case-sensitive match) encryption context to decrypt the data. An encryption context is optional when encrypting with a symmetric CMK, but it is highly recommended. For more information, see Encryption Context in the AWS Key Management Service Developer Guide.
        public let destinationEncryptionContext: [String: String]?
        /// A unique identifier for the CMK that is used to reencrypt the data. Specify a symmetric or asymmetric CMK with a KeyUsage value of ENCRYPT_DECRYPT. To find the KeyUsage value of a CMK, use the DescribeKey operation. To specify a CMK, use its key ID, Amazon Resource Name (ARN), alias name, or alias ARN. When using an alias name, prefix it with "alias/". To specify a CMK in a different AWS account, you must use the key ARN or alias ARN. For example:   Key ID: 1234abcd-12ab-34cd-56ef-1234567890ab    Key ARN: arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab    Alias name: alias/ExampleAlias    Alias ARN: arn:aws:kms:us-east-2:111122223333:alias/ExampleAlias    To get the key ID and key ARN for a CMK, use ListKeys or DescribeKey. To get the alias name and alias ARN, use ListAliases.
        public let destinationKeyId: String
        /// A list of grant tokens. For more information, see Grant Tokens in the AWS Key Management Service Developer Guide.
        public let grantTokens: [String]?
        /// Specifies the encryption algorithm that AWS KMS will use to decrypt the ciphertext before it is reencrypted. The default value, SYMMETRIC_DEFAULT, represents the algorithm used for symmetric CMKs. Specify the same algorithm that was used to encrypt the ciphertext. If you specify a different algorithm, the decrypt attempt fails. This parameter is required only when the ciphertext was encrypted under an asymmetric CMK.
        public let sourceEncryptionAlgorithm: EncryptionAlgorithmSpec?
        /// Specifies the encryption context to use to decrypt the ciphertext. Enter the same encryption context that was used to encrypt the ciphertext. An encryption context is a collection of non-secret key-value pairs that represents additional authenticated data. When you use an encryption context to encrypt data, you must specify the same (an exact case-sensitive match) encryption context to decrypt the data. An encryption context is optional when encrypting with a symmetric CMK, but it is highly recommended. For more information, see Encryption Context in the AWS Key Management Service Developer Guide.
        public let sourceEncryptionContext: [String: String]?
        /// Specifies the customer master key (CMK) that AWS KMS will use to decrypt the ciphertext before it is re-encrypted. Enter a key ID of the CMK that was used to encrypt the ciphertext. This parameter is required only when the ciphertext was encrypted under an asymmetric CMK. If you used a symmetric CMK, AWS KMS can get the CMK from metadata that it adds to the symmetric ciphertext blob. However, it is always recommended as a best practice. This practice ensures that you use the CMK that you intend. To specify a CMK, use its key ID, Amazon Resource Name (ARN), alias name, or alias ARN. When using an alias name, prefix it with "alias/". To specify a CMK in a different AWS account, you must use the key ARN or alias ARN. For example:   Key ID: 1234abcd-12ab-34cd-56ef-1234567890ab    Key ARN: arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab    Alias name: alias/ExampleAlias    Alias ARN: arn:aws:kms:us-east-2:111122223333:alias/ExampleAlias    To get the key ID and key ARN for a CMK, use ListKeys or DescribeKey. To get the alias name and alias ARN, use ListAliases.
        public let sourceKeyId: String?

        public init(ciphertextBlob: Data, destinationEncryptionAlgorithm: EncryptionAlgorithmSpec? = nil, destinationEncryptionContext: [String: String]? = nil, destinationKeyId: String, grantTokens: [String]? = nil, sourceEncryptionAlgorithm: EncryptionAlgorithmSpec? = nil, sourceEncryptionContext: [String: String]? = nil, sourceKeyId: String? = nil) {
            self.ciphertextBlob = ciphertextBlob
            self.destinationEncryptionAlgorithm = destinationEncryptionAlgorithm
            self.destinationEncryptionContext = destinationEncryptionContext
            self.destinationKeyId = destinationKeyId
            self.grantTokens = grantTokens
            self.sourceEncryptionAlgorithm = sourceEncryptionAlgorithm
            self.sourceEncryptionContext = sourceEncryptionContext
            self.sourceKeyId = sourceKeyId
        }

        public func validate(name: String) throws {
            try self.validate(self.ciphertextBlob, name: "ciphertextBlob", parent: name, max: 6144)
            try self.validate(self.ciphertextBlob, name: "ciphertextBlob", parent: name, min: 1)
            try self.validate(self.destinationKeyId, name: "destinationKeyId", parent: name, max: 2048)
            try self.validate(self.destinationKeyId, name: "destinationKeyId", parent: name, min: 1)
            try self.grantTokens?.forEach {
                try validate($0, name: "grantTokens[]", parent: name, max: 8192)
                try validate($0, name: "grantTokens[]", parent: name, min: 1)
            }
            try self.validate(self.grantTokens, name: "grantTokens", parent: name, max: 10)
            try self.validate(self.grantTokens, name: "grantTokens", parent: name, min: 0)
            try self.validate(self.sourceKeyId, name: "sourceKeyId", parent: name, max: 2048)
            try self.validate(self.sourceKeyId, name: "sourceKeyId", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case ciphertextBlob = "CiphertextBlob"
            case destinationEncryptionAlgorithm = "DestinationEncryptionAlgorithm"
            case destinationEncryptionContext = "DestinationEncryptionContext"
            case destinationKeyId = "DestinationKeyId"
            case grantTokens = "GrantTokens"
            case sourceEncryptionAlgorithm = "SourceEncryptionAlgorithm"
            case sourceEncryptionContext = "SourceEncryptionContext"
            case sourceKeyId = "SourceKeyId"
        }
    }

    public struct ReEncryptResponse: AWSDecodableShape {
        /// The reencrypted data. When you use the HTTP API or the AWS CLI, the value is Base64-encoded. Otherwise, it is not Base64-encoded.
        public let ciphertextBlob: Data?
        /// The encryption algorithm that was used to reencrypt the data.
        public let destinationEncryptionAlgorithm: EncryptionAlgorithmSpec?
        /// The Amazon Resource Name (key ARN) of the CMK that was used to reencrypt the data.
        public let keyId: String?
        /// The encryption algorithm that was used to decrypt the ciphertext before it was reencrypted.
        public let sourceEncryptionAlgorithm: EncryptionAlgorithmSpec?
        /// Unique identifier of the CMK used to originally encrypt the data.
        public let sourceKeyId: String?

        public init(ciphertextBlob: Data? = nil, destinationEncryptionAlgorithm: EncryptionAlgorithmSpec? = nil, keyId: String? = nil, sourceEncryptionAlgorithm: EncryptionAlgorithmSpec? = nil, sourceKeyId: String? = nil) {
            self.ciphertextBlob = ciphertextBlob
            self.destinationEncryptionAlgorithm = destinationEncryptionAlgorithm
            self.keyId = keyId
            self.sourceEncryptionAlgorithm = sourceEncryptionAlgorithm
            self.sourceKeyId = sourceKeyId
        }

        private enum CodingKeys: String, CodingKey {
            case ciphertextBlob = "CiphertextBlob"
            case destinationEncryptionAlgorithm = "DestinationEncryptionAlgorithm"
            case keyId = "KeyId"
            case sourceEncryptionAlgorithm = "SourceEncryptionAlgorithm"
            case sourceKeyId = "SourceKeyId"
        }
    }

    public struct RetireGrantRequest: AWSEncodableShape {
        /// Unique identifier of the grant to retire. The grant ID is returned in the response to a CreateGrant operation.   Grant ID Example - 0123456789012345678901234567890123456789012345678901234567890123
        public let grantId: String?
        /// Token that identifies the grant to be retired.
        public let grantToken: String?
        /// The Amazon Resource Name (ARN) of the CMK associated with the grant.  For example: arn:aws:kms:us-east-2:444455556666:key/1234abcd-12ab-34cd-56ef-1234567890ab
        public let keyId: String?

        public init(grantId: String? = nil, grantToken: String? = nil, keyId: String? = nil) {
            self.grantId = grantId
            self.grantToken = grantToken
            self.keyId = keyId
        }

        public func validate(name: String) throws {
            try self.validate(self.grantId, name: "grantId", parent: name, max: 128)
            try self.validate(self.grantId, name: "grantId", parent: name, min: 1)
            try self.validate(self.grantToken, name: "grantToken", parent: name, max: 8192)
            try self.validate(self.grantToken, name: "grantToken", parent: name, min: 1)
            try self.validate(self.keyId, name: "keyId", parent: name, max: 2048)
            try self.validate(self.keyId, name: "keyId", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case grantId = "GrantId"
            case grantToken = "GrantToken"
            case keyId = "KeyId"
        }
    }

    public struct RevokeGrantRequest: AWSEncodableShape {
        /// Identifier of the grant to be revoked.
        public let grantId: String
        /// A unique identifier for the customer master key associated with the grant. Specify the key ID or the Amazon Resource Name (ARN) of the CMK. To specify a CMK in a different AWS account, you must use the key ARN. For example:   Key ID: 1234abcd-12ab-34cd-56ef-1234567890ab    Key ARN: arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab    To get the key ID and key ARN for a CMK, use ListKeys or DescribeKey.
        public let keyId: String

        public init(grantId: String, keyId: String) {
            self.grantId = grantId
            self.keyId = keyId
        }

        public func validate(name: String) throws {
            try self.validate(self.grantId, name: "grantId", parent: name, max: 128)
            try self.validate(self.grantId, name: "grantId", parent: name, min: 1)
            try self.validate(self.keyId, name: "keyId", parent: name, max: 2048)
            try self.validate(self.keyId, name: "keyId", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case grantId = "GrantId"
            case keyId = "KeyId"
        }
    }

    public struct ScheduleKeyDeletionRequest: AWSEncodableShape {
        /// The unique identifier of the customer master key (CMK) to delete. Specify the key ID or the Amazon Resource Name (ARN) of the CMK. For example:   Key ID: 1234abcd-12ab-34cd-56ef-1234567890ab    Key ARN: arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab    To get the key ID and key ARN for a CMK, use ListKeys or DescribeKey.
        public let keyId: String
        /// The waiting period, specified in number of days. After the waiting period ends, AWS KMS deletes the customer master key (CMK). This value is optional. If you include a value, it must be between 7 and 30, inclusive. If you do not include a value, it defaults to 30.
        public let pendingWindowInDays: Int?

        public init(keyId: String, pendingWindowInDays: Int? = nil) {
            self.keyId = keyId
            self.pendingWindowInDays = pendingWindowInDays
        }

        public func validate(name: String) throws {
            try self.validate(self.keyId, name: "keyId", parent: name, max: 2048)
            try self.validate(self.keyId, name: "keyId", parent: name, min: 1)
            try self.validate(self.pendingWindowInDays, name: "pendingWindowInDays", parent: name, max: 365)
            try self.validate(self.pendingWindowInDays, name: "pendingWindowInDays", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case keyId = "KeyId"
            case pendingWindowInDays = "PendingWindowInDays"
        }
    }

    public struct ScheduleKeyDeletionResponse: AWSDecodableShape {
        /// The date and time after which AWS KMS deletes the customer master key (CMK).
        public let deletionDate: Date?
        /// The Amazon Resource Name (key ARN) of the CMK whose deletion is scheduled.
        public let keyId: String?

        public init(deletionDate: Date? = nil, keyId: String? = nil) {
            self.deletionDate = deletionDate
            self.keyId = keyId
        }

        private enum CodingKeys: String, CodingKey {
            case deletionDate = "DeletionDate"
            case keyId = "KeyId"
        }
    }

    public struct SignRequest: AWSEncodableShape {
        /// A list of grant tokens. For more information, see Grant Tokens in the AWS Key Management Service Developer Guide.
        public let grantTokens: [String]?
        /// Identifies an asymmetric CMK. AWS KMS uses the private key in the asymmetric CMK to sign the message. The KeyUsage type of the CMK must be SIGN_VERIFY. To find the KeyUsage of a CMK, use the DescribeKey operation. To specify a CMK, use its key ID, Amazon Resource Name (ARN), alias name, or alias ARN. When using an alias name, prefix it with "alias/". To specify a CMK in a different AWS account, you must use the key ARN or alias ARN. For example:   Key ID: 1234abcd-12ab-34cd-56ef-1234567890ab    Key ARN: arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab    Alias name: alias/ExampleAlias    Alias ARN: arn:aws:kms:us-east-2:111122223333:alias/ExampleAlias    To get the key ID and key ARN for a CMK, use ListKeys or DescribeKey. To get the alias name and alias ARN, use ListAliases.
        public let keyId: String
        /// Specifies the message or message digest to sign. Messages can be 0-4096 bytes. To sign a larger message, provide the message digest. If you provide a message, AWS KMS generates a hash digest of the message and then signs it.
        public let message: Data
        /// Tells AWS KMS whether the value of the Message parameter is a message or message digest. The default value, RAW, indicates a message. To indicate a message digest, enter DIGEST.
        public let messageType: MessageType?
        /// Specifies the signing algorithm to use when signing the message.  Choose an algorithm that is compatible with the type and size of the specified asymmetric CMK.
        public let signingAlgorithm: SigningAlgorithmSpec

        public init(grantTokens: [String]? = nil, keyId: String, message: Data, messageType: MessageType? = nil, signingAlgorithm: SigningAlgorithmSpec) {
            self.grantTokens = grantTokens
            self.keyId = keyId
            self.message = message
            self.messageType = messageType
            self.signingAlgorithm = signingAlgorithm
        }

        public func validate(name: String) throws {
            try self.grantTokens?.forEach {
                try validate($0, name: "grantTokens[]", parent: name, max: 8192)
                try validate($0, name: "grantTokens[]", parent: name, min: 1)
            }
            try self.validate(self.grantTokens, name: "grantTokens", parent: name, max: 10)
            try self.validate(self.grantTokens, name: "grantTokens", parent: name, min: 0)
            try self.validate(self.keyId, name: "keyId", parent: name, max: 2048)
            try self.validate(self.keyId, name: "keyId", parent: name, min: 1)
            try self.validate(self.message, name: "message", parent: name, max: 4096)
            try self.validate(self.message, name: "message", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case grantTokens = "GrantTokens"
            case keyId = "KeyId"
            case message = "Message"
            case messageType = "MessageType"
            case signingAlgorithm = "SigningAlgorithm"
        }
    }

    public struct SignResponse: AWSDecodableShape {
        /// The Amazon Resource Name (key ARN) of the asymmetric CMK that was used to sign the message.
        public let keyId: String?
        /// The cryptographic signature that was generated for the message.    When used with the supported RSA signing algorithms, the encoding of this value is defined by PKCS #1 in RFC 8017.   When used with the ECDSA_SHA_256, ECDSA_SHA_384, or ECDSA_SHA_512 signing algorithms, this value is a DER-encoded object as defined by ANS X9.62–2005 and RFC 3279 Section 2.2.3. This is the most commonly used signature format and is appropriate for most uses.    When you use the HTTP API or the AWS CLI, the value is Base64-encoded. Otherwise, it is not Base64-encoded.
        public let signature: Data?
        /// The signing algorithm that was used to sign the message.
        public let signingAlgorithm: SigningAlgorithmSpec?

        public init(keyId: String? = nil, signature: Data? = nil, signingAlgorithm: SigningAlgorithmSpec? = nil) {
            self.keyId = keyId
            self.signature = signature
            self.signingAlgorithm = signingAlgorithm
        }

        private enum CodingKeys: String, CodingKey {
            case keyId = "KeyId"
            case signature = "Signature"
            case signingAlgorithm = "SigningAlgorithm"
        }
    }

    public struct Tag: AWSEncodableShape & AWSDecodableShape {
        /// The key of the tag.
        public let tagKey: String
        /// The value of the tag.
        public let tagValue: String

        public init(tagKey: String, tagValue: String) {
            self.tagKey = tagKey
            self.tagValue = tagValue
        }

        public func validate(name: String) throws {
            try self.validate(self.tagKey, name: "tagKey", parent: name, max: 128)
            try self.validate(self.tagKey, name: "tagKey", parent: name, min: 1)
            try self.validate(self.tagValue, name: "tagValue", parent: name, max: 256)
            try self.validate(self.tagValue, name: "tagValue", parent: name, min: 0)
        }

        private enum CodingKeys: String, CodingKey {
            case tagKey = "TagKey"
            case tagValue = "TagValue"
        }
    }

    public struct TagResourceRequest: AWSEncodableShape {
        /// Identifies a customer managed CMK in the account and Region. Specify the key ID or the Amazon Resource Name (ARN) of the CMK. For example:   Key ID: 1234abcd-12ab-34cd-56ef-1234567890ab    Key ARN: arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab    To get the key ID and key ARN for a CMK, use ListKeys or DescribeKey.
        public let keyId: String
        /// One or more tags.  Each tag consists of a tag key and a tag value. The tag value can be an empty (null) string.  You cannot have more than one tag on a CMK with the same tag key. If you specify an existing tag key with a different tag value, AWS KMS replaces the current tag value with the specified one.
        public let tags: [Tag]

        public init(keyId: String, tags: [Tag]) {
            self.keyId = keyId
            self.tags = tags
        }

        public func validate(name: String) throws {
            try self.validate(self.keyId, name: "keyId", parent: name, max: 2048)
            try self.validate(self.keyId, name: "keyId", parent: name, min: 1)
            try self.tags.forEach {
                try $0.validate(name: "\(name).tags[]")
            }
        }

        private enum CodingKeys: String, CodingKey {
            case keyId = "KeyId"
            case tags = "Tags"
        }
    }

    public struct UntagResourceRequest: AWSEncodableShape {
        /// Identifies the CMK from which you are removing tags. Specify the key ID or the Amazon Resource Name (ARN) of the CMK. For example:   Key ID: 1234abcd-12ab-34cd-56ef-1234567890ab    Key ARN: arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab    To get the key ID and key ARN for a CMK, use ListKeys or DescribeKey.
        public let keyId: String
        /// One or more tag keys. Specify only the tag keys, not the tag values.
        public let tagKeys: [String]

        public init(keyId: String, tagKeys: [String]) {
            self.keyId = keyId
            self.tagKeys = tagKeys
        }

        public func validate(name: String) throws {
            try self.validate(self.keyId, name: "keyId", parent: name, max: 2048)
            try self.validate(self.keyId, name: "keyId", parent: name, min: 1)
            try self.tagKeys.forEach {
                try validate($0, name: "tagKeys[]", parent: name, max: 128)
                try validate($0, name: "tagKeys[]", parent: name, min: 1)
            }
        }

        private enum CodingKeys: String, CodingKey {
            case keyId = "KeyId"
            case tagKeys = "TagKeys"
        }
    }

    public struct UpdateAliasRequest: AWSEncodableShape {
        /// Identifies the alias that is changing its CMK. This value must begin with alias/ followed by the alias name, such as alias/ExampleAlias. You cannot use UpdateAlias to change the alias name.
        public let aliasName: String
        /// Identifies the customer managed CMK to associate with the alias. You don't have permission to associate an alias with an AWS managed CMK. The CMK must be in the same AWS account and Region as the alias. Also, the new target CMK must be the same type as the current target CMK (both symmetric or both asymmetric) and they must have the same key usage.  Specify the key ID or the Amazon Resource Name (ARN) of the CMK. For example:   Key ID: 1234abcd-12ab-34cd-56ef-1234567890ab    Key ARN: arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab    To get the key ID and key ARN for a CMK, use ListKeys or DescribeKey. To verify that the alias is mapped to the correct CMK, use ListAliases.
        public let targetKeyId: String

        public init(aliasName: String, targetKeyId: String) {
            self.aliasName = aliasName
            self.targetKeyId = targetKeyId
        }

        public func validate(name: String) throws {
            try self.validate(self.aliasName, name: "aliasName", parent: name, max: 256)
            try self.validate(self.aliasName, name: "aliasName", parent: name, min: 1)
            try self.validate(self.aliasName, name: "aliasName", parent: name, pattern: "^[a-zA-Z0-9:/_-]+$")
            try self.validate(self.targetKeyId, name: "targetKeyId", parent: name, max: 2048)
            try self.validate(self.targetKeyId, name: "targetKeyId", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case aliasName = "AliasName"
            case targetKeyId = "TargetKeyId"
        }
    }

    public struct UpdateCustomKeyStoreRequest: AWSEncodableShape {
        /// Associates the custom key store with a related AWS CloudHSM cluster.  Enter the cluster ID of the cluster that you used to create the custom key store or a cluster that shares a backup history and has the same cluster certificate as the original cluster. You cannot use this parameter to associate a custom key store with an unrelated cluster. In addition, the replacement cluster must fulfill the requirements for a cluster associated with a custom key store. To view the cluster certificate of a cluster, use the DescribeClusters operation.
        public let cloudHsmClusterId: String?
        /// Identifies the custom key store that you want to update. Enter the ID of the custom key store. To find the ID of a custom key store, use the DescribeCustomKeyStores operation.
        public let customKeyStoreId: String
        /// Enter the current password of the kmsuser crypto user (CU) in the AWS CloudHSM cluster that is associated with the custom key store. This parameter tells AWS KMS the current password of the kmsuser crypto user (CU). It does not set or change the password of any users in the AWS CloudHSM cluster.
        public let keyStorePassword: String?
        /// Changes the friendly name of the custom key store to the value that you specify. The custom key store name must be unique in the AWS account.
        public let newCustomKeyStoreName: String?

        public init(cloudHsmClusterId: String? = nil, customKeyStoreId: String, keyStorePassword: String? = nil, newCustomKeyStoreName: String? = nil) {
            self.cloudHsmClusterId = cloudHsmClusterId
            self.customKeyStoreId = customKeyStoreId
            self.keyStorePassword = keyStorePassword
            self.newCustomKeyStoreName = newCustomKeyStoreName
        }

        public func validate(name: String) throws {
            try self.validate(self.cloudHsmClusterId, name: "cloudHsmClusterId", parent: name, max: 24)
            try self.validate(self.cloudHsmClusterId, name: "cloudHsmClusterId", parent: name, min: 19)
            try self.validate(self.customKeyStoreId, name: "customKeyStoreId", parent: name, max: 64)
            try self.validate(self.customKeyStoreId, name: "customKeyStoreId", parent: name, min: 1)
            try self.validate(self.keyStorePassword, name: "keyStorePassword", parent: name, max: 32)
            try self.validate(self.keyStorePassword, name: "keyStorePassword", parent: name, min: 7)
            try self.validate(self.newCustomKeyStoreName, name: "newCustomKeyStoreName", parent: name, max: 256)
            try self.validate(self.newCustomKeyStoreName, name: "newCustomKeyStoreName", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case cloudHsmClusterId = "CloudHsmClusterId"
            case customKeyStoreId = "CustomKeyStoreId"
            case keyStorePassword = "KeyStorePassword"
            case newCustomKeyStoreName = "NewCustomKeyStoreName"
        }
    }

    public struct UpdateCustomKeyStoreResponse: AWSDecodableShape {
        public init() {}
    }

    public struct UpdateKeyDescriptionRequest: AWSEncodableShape {
        /// New description for the CMK.
        public let description: String
        /// A unique identifier for the customer master key (CMK). Specify the key ID or the Amazon Resource Name (ARN) of the CMK. For example:   Key ID: 1234abcd-12ab-34cd-56ef-1234567890ab    Key ARN: arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab    To get the key ID and key ARN for a CMK, use ListKeys or DescribeKey.
        public let keyId: String

        public init(description: String, keyId: String) {
            self.description = description
            self.keyId = keyId
        }

        public func validate(name: String) throws {
            try self.validate(self.description, name: "description", parent: name, max: 8192)
            try self.validate(self.description, name: "description", parent: name, min: 0)
            try self.validate(self.keyId, name: "keyId", parent: name, max: 2048)
            try self.validate(self.keyId, name: "keyId", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case description = "Description"
            case keyId = "KeyId"
        }
    }

    public struct VerifyRequest: AWSEncodableShape {
        /// A list of grant tokens. For more information, see Grant Tokens in the AWS Key Management Service Developer Guide.
        public let grantTokens: [String]?
        /// Identifies the asymmetric CMK that will be used to verify the signature. This must be the same CMK that was used to generate the signature. If you specify a different CMK, the signature verification fails. To specify a CMK, use its key ID, Amazon Resource Name (ARN), alias name, or alias ARN. When using an alias name, prefix it with "alias/". To specify a CMK in a different AWS account, you must use the key ARN or alias ARN. For example:   Key ID: 1234abcd-12ab-34cd-56ef-1234567890ab    Key ARN: arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab    Alias name: alias/ExampleAlias    Alias ARN: arn:aws:kms:us-east-2:111122223333:alias/ExampleAlias    To get the key ID and key ARN for a CMK, use ListKeys or DescribeKey. To get the alias name and alias ARN, use ListAliases.
        public let keyId: String
        /// Specifies the message that was signed. You can submit a raw message of up to 4096 bytes, or a hash digest of the message. If you submit a digest, use the MessageType parameter with a value of DIGEST. If the message specified here is different from the message that was signed, the signature verification fails. A message and its hash digest are considered to be the same message.
        public let message: Data
        /// Tells AWS KMS whether the value of the Message parameter is a message or message digest. The default value, RAW, indicates a message. To indicate a message digest, enter DIGEST.  Use the DIGEST value only when the value of the Message parameter is a message digest. If you use the DIGEST value with a raw message, the security of the verification operation can be compromised.
        public let messageType: MessageType?
        /// The signature that the Sign operation generated.
        public let signature: Data
        /// The signing algorithm that was used to sign the message. If you submit a different algorithm, the signature verification fails.
        public let signingAlgorithm: SigningAlgorithmSpec

        public init(grantTokens: [String]? = nil, keyId: String, message: Data, messageType: MessageType? = nil, signature: Data, signingAlgorithm: SigningAlgorithmSpec) {
            self.grantTokens = grantTokens
            self.keyId = keyId
            self.message = message
            self.messageType = messageType
            self.signature = signature
            self.signingAlgorithm = signingAlgorithm
        }

        public func validate(name: String) throws {
            try self.grantTokens?.forEach {
                try validate($0, name: "grantTokens[]", parent: name, max: 8192)
                try validate($0, name: "grantTokens[]", parent: name, min: 1)
            }
            try self.validate(self.grantTokens, name: "grantTokens", parent: name, max: 10)
            try self.validate(self.grantTokens, name: "grantTokens", parent: name, min: 0)
            try self.validate(self.keyId, name: "keyId", parent: name, max: 2048)
            try self.validate(self.keyId, name: "keyId", parent: name, min: 1)
            try self.validate(self.message, name: "message", parent: name, max: 4096)
            try self.validate(self.message, name: "message", parent: name, min: 1)
            try self.validate(self.signature, name: "signature", parent: name, max: 6144)
            try self.validate(self.signature, name: "signature", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case grantTokens = "GrantTokens"
            case keyId = "KeyId"
            case message = "Message"
            case messageType = "MessageType"
            case signature = "Signature"
            case signingAlgorithm = "SigningAlgorithm"
        }
    }

    public struct VerifyResponse: AWSDecodableShape {
        /// The Amazon Resource Name (key ARN) of the asymmetric CMK that was used to verify the signature.
        public let keyId: String?
        /// A Boolean value that indicates whether the signature was verified. A value of True indicates that the Signature was produced by signing the Message with the specified KeyID and SigningAlgorithm. If the signature is not verified, the Verify operation fails with a KMSInvalidSignatureException exception.
        public let signatureValid: Bool?
        /// The signing algorithm that was used to verify the signature.
        public let signingAlgorithm: SigningAlgorithmSpec?

        public init(keyId: String? = nil, signatureValid: Bool? = nil, signingAlgorithm: SigningAlgorithmSpec? = nil) {
            self.keyId = keyId
            self.signatureValid = signatureValid
            self.signingAlgorithm = signingAlgorithm
        }

        private enum CodingKeys: String, CodingKey {
            case keyId = "KeyId"
            case signatureValid = "SignatureValid"
            case signingAlgorithm = "SigningAlgorithm"
        }
    }
}
